2015-04-28 7 views
9

मैं the documentation से बाहर नहीं निकल सकता क्यों SQL सर्वर निर्दिष्ट शैली के अलावा किसी प्रारूप में टेक्स्ट को पार करता है।SQL सर्वर एक अमान्य शैली का उपयोग कर VARCHAR को DATETIME में क्यों परिवर्तित करता है?

कि क्या मैं उम्मीद प्रारूप में पाठ प्रदान की परवाह किए बिना: (शैली 113 के लिए)

SELECT CONVERT(DATETIME, N'20150601', 112) 

या गलत स्वरूप:

SELECT CONVERT(DATETIME, N'20150601', 113) 

परिणाम एक ही कर रहे हैं: 2015-06-01 00:00:00.000 मैं बाद उम्मीद करेंगे तिथि (सही ढंग से) को बदलने में विफल होने के लिए।

VARCHAR से DATETIME को परिवर्तित करने का प्रयास करते समय यह कौन से नियमों को नियोजित करता है? अर्थात। उत्तरार्द्ध (गलत प्रारूप शैली) अभी भी तारीख को सही तरीके से क्यों पार्स करता है?

संपादित करें: ऐसा लगता है कि मैं पर्याप्त स्पष्ट नहीं हुआ हूं। स्टाइल 113dd mon yyyy hh:mi:ss:mmm(24h) की अपेक्षा करनी चाहिए लेकिन यह किसी कारण से yyyymmdd प्रारूप में मूल्यों को खुशी से परिवर्तित करता है।

+1

आप DATETIME को वापस कर रहे हैं, DATETIME के ​​पाठपरक प्रतिनिधित्व नहीं, इसलिए शैली अप्रासंगिक है। यदि आप शैली को कुछ करने के लिए देखना चाहते हैं तो फिर DATETIME को फिर से VARCHAR पर कनवर्ट करें, उदा। कन्वर्ट चुनें (वचर (20), कन्वर्ट (डेटाटाइम, एन'20150601 '), 113) –

+0

शायद वास्तविक रूप से पहले एक अंतर्निहित रूपांतरण हो रहा है? – Blim

+0

मेरा उत्तर हटा दिया गया, लेकिन जब अभिव्यक्ति दिनांक या समय डेटा प्रकार है, तो शैली निम्न तालिका में दिखाए गए मानों में से एक हो सकती है। आपके पास ** ** ** डेटाटाइम अभिव्यक्ति नहीं है। – Mackan

उत्तर

6

क्योंकि तिथि एक कैननिकल प्रारूप अर्थात (20150101) में है। डेटाबेस इंजन इसे पूरी तरह से गिरता है। यह एक संगतता सुविधा है।

यदि आपने इन्हें ब्रिटेन या यूएस दिनांक स्वरूपों में बदल दिया है, तो आपको रूपांतरण त्रुटियां मिलेंगी, क्योंकि उन्हें पूर्ण रूप से परिवर्तित नहीं किया जा सकता है।

संपादित करें: आप वास्तव में यह एक सुअर में बदलने के लिए यह बता सकते हैं, और यह अभी भी परोक्ष यह तिथि समय में रूपांतरित होगा:

:

select convert(datetime,'20150425',99999999) 
select convert(datetime,'20150425',100) 
select convert(datetime,'20150425',113) 
select convert(datetime,'20150425',010) 
select convert(datetime,'20150425',8008135) 
select convert(datetime,'20150425',000) 

और अवधारणा का सबूत है कि यह एक अनुकूलता सुविधा है

select convert(datetime2,'20150425',99999999) 

हालांकि आप अभी भी डेटाटाइम 2 ऑब्जेक्ट्स को पूरी तरह से परिवर्तित कर सकते हैं, लेकिन शैली रूपांतरण चार्ट के दायरे में होनी चाहिए।

+0

2015-01-01 प्रारूप हालांकि काम नहीं करता है। – Blim

+0

अच्छी जगह। ऐसा इसलिए है क्योंकि आप दिनांक स्ट्रिंग में शैलियों को जोड़ रहे हैं। –

+0

मेरा मुद्दा यह है कि यह yyyyMMdd प्रारूप – Blim

-1

आप क्रम में varchar प्रकार में बदलने का उन स्वरूपों लागू करने के लिए करना चाहिए:

SELECT CONVERT(varchar(100), CAST('20150601' as date), 113) 

ठीक है, आप datetime को datetime परिवर्तित कर रहे हैं। आपने क्या उम्मीद किया? प्रारूपों को लागू करने के लिए आपको varchar में परिवर्तित करना चाहिए और आपके पास दिनांक या समय प्रकार दूसरे पैरामीटर के रूप में होना चाहिए।

+1

मेरा सवाल यह है कि यह * * 'DATETIME' * में परिवर्तित क्यों होता है, यह प्रदर्शित नहीं होता है। –

1

कारण दिनांक N'20150601' वैध डेटाटाइम में कनवर्ट किया गया है, वास्तव में यह है कि शाब्दिक N'20150601' SQL सर्वर में डेटाटाइम का सार्वभौमिक नोटेशन है। इसका अर्थ यह है कि, यदि आप प्रारूप N'yyyymmdd 'में डेटाटाइम मान बताते हैं, तो SQL सर्वर जानता है कि यह सार्वभौमिक डेटाटाइम प्रारूप है और यह पता है कि इसे कैसे पढ़ा जाए।

+0

स्टाइल 'NVARCHAR' और 'VARCHAR' पर समान रूप से लागू होते हैं। 'चयन कनवर्ट करें (डेटाटाइम, एन'03/06/2015', 113) 'यह देखने के लिए कि शैली लागू की जा रही है। –

संबंधित मुद्दे