यह सिर्फ प्रलेखित व्यवहार है। मुझे नहीं लगता कि किसी ने सेटिंग्स के साथ खिलवाड़ किया।
MSDN पर डेटा प्रकार की पूर्ववर्ती स्थिति देखें ।
जब कोई ऑपरेटर अलग-अलग डेटा प्रकारों के दो भावों को जोड़ता है, तो डेटा प्रकार की पूर्ववर्तीता के नियम निर्दिष्ट करते हैं कि निम्न पूर्वता वाला डेटा प्रकार उच्च वरीयता वाले डेटा प्रकार में परिवर्तित हो जाता है।
जैसा कि टिप्पणियों में उल्लेख किया गया है कि खाली स्ट्रिंग किसी भी संख्यात्मक प्रकार में 0 में परिवर्तित हो जाती है और दिनांक में परिवर्तित होने पर 1900-01-01 00: 00: 00.000 तक।
संपादित करें: मुझे लगता है कि आपकी वास्तविक समस्या यह है कि आपका डिज़ाइन इतना है कि आपको एक अलग डेटा प्रकार के क्षेत्रों में शामिल होना है। इसके आस-पास आने का एकमात्र तरीका यह है कि आपके ज्वाइन क्लॉज में एक कन्वर्सेशन हो, जिससे क्वेरी परफॉर्मेंस को नुकसान पहुंचे। मुख्य समस्या संभवतः स्कीमा डिज़ाइन के साथ है
EDIT: उन टिप्पणियों पर बहुत चर्चा हुई, जिन्हें चैट करने के लिए स्थानांतरित किया गया है। हालांकि, यह अतार्किक हो सकता है कि एक खाली स्ट्रिंग को अन्य डेटा प्रकारों में परिवर्तित करने से मनमाना मान उत्पन्न होता है।
यह कोड:
SELECT CONVERT(int, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')
SELECT CONVERT(datetime, '')
इस उत्पादन का उत्पादन:
0
0
1900-01-01
1900-01-01 00:00:00.000
आप तब उम्मीद कर सकते हैं कि यह व्यवहार अन्य पूर्ववर्ती डेटाटिप्स के बीच सुसंगत है और उम्मीद करता है कि 0 को एक तिथि में परिवर्तित करने से समान मनमाना मूल्य प्राप्त होगा लेकिन ऐसा नहीं होता है।
SELECT CONVERT(date, 0)
का उत्पादन
डेटा प्रकार इंट से आज तक स्पष्ट रूपांतरण की अनुमति नहीं है।
क्योंकि यह समर्थित रूपांतरण नहीं है
जबकि
SELECT CONVERT(datetime, 0)
रिटर्न
जनवरी, 01 1900 00:00:00
तो हाँ, यह अजीब और मनमाना है, लेकिन वास्तव में दस्तावेज और व्याख्या करने योग्य है।