2012-12-28 18 views
8

साथ मैं हमेशा datetime में रूपांतरण के लिए इस कोड का उपयोग करें:एसक्यूएल सर्वर रूपांतरण मुद्दा datetime

DECLARE @a datetime 
SET @a= CONVERT(datetime,'2012-12-28 14:04:43') 
print @a 

लेकिन यह अब और काम नहीं करता है! मैं भी एसक्यूएल सर्वर को पुन: प्रारंभ की कोशिश की, लेकिन समस्या बनी हुई है:

Conversion error

छवि में त्रुटि इतालवी में है। अंग्रेजी में होना चाहिए:

datetime करने के लिए एक चार डेटा प्रकार के रूपांतरण एक datetime मूल्य अनुमति प्राप्त मान की सीमा से बाहर है कि में हुई।

+0

क्या आपने हाल ही में अपने लॉगिन की डिफ़ॉल्ट भाषा इतालवी में बदल दी है? यह 'DATEFORMAT' को प्रभावित करता है और तारीखों को कैसे पार्स किया जाता है। यदि आप 'सेट भाषा अंग्रेजी' करते हैं तो आपका कोड ठीक काम करता है लेकिन 'SET LANGUAGE italian' –

उत्तर

15

कई एसक्यूएल सर्वर द्वारा समर्थित प्रारूपों हैं - MSDN Books Online on CAST and CONVERT देखते हैं। उन प्रारूपों में से अधिकांश प्रारूप निर्भर हैं आपके पास कौन सी सेटिंग्स हैं - इसलिए, ये सेटिंग्स कुछ बार काम कर सकती हैं - और कभी-कभी नहीं।

इस हल करने के लिए जिस तरह से (थोड़ा अनुकूलित) आईएसओ 8601 दिनांक स्वरूप कि एसक्यूएल सर्वर द्वारा समर्थित है का उपयोग करना है - इस प्रारूप काम करता है हमेशा - अपने एसक्यूएल सर्वर भाषा और DateFormat सेटिंग की परवाह किए बिना।

ISO-8601 format एसक्यूएल सर्वर द्वारा समर्थित है दो रूपों में आता है:

  • YYYYMMDD सिर्फ तारीखें (कुछ ही समय भाग) के लिए; यहां ध्यान दें: कोई डैश नहीं!, यह बहुत महत्वपूर्ण है! YYYY-MM-DD आपके SQL सर्वर में डेटफॉर्मेट सेटिंग्स से स्वतंत्र नहीं है और सभी परिस्थितियों में काम करेगा!

या:

  • दिनांक और समय के लिए YYYY-MM-DDTHH:MM:SS - यहाँ ध्यान दें: इस प्रारूप डैश है (लेकिन वे छोड़ा जा सकता है), और एक निश्चित T दिनांक और समय के बीच परिसीमक के रूप में आपके DATETIME का हिस्सा।

यह SQL Server 2000 और नए के लिए मान्य है। नहींDATETIME -

आप एसक्यूएल सर्वर 2008 या नए और DATE डेटाप्रकार (केवल DATE का उपयोग करते हैं!), तो आप वास्तव में YYYY-MM-DD प्रारूप का भी उपयोग कर सकते हैं और यह आपके SQL सर्वर में किसी भी सेटिंग के साथ भी काम करेगा।

मुझसे मत पूछें कि यह पूरा विषय इतना मुश्किल क्यों है और कुछ हद तक भ्रमित है - यही वही तरीका है। लेकिन YYYYMMDD प्रारूप के साथ, आपको SQL सर्वर के किसी भी संस्करण और आपके SQL सर्वर में किसी भी भाषा और दिनांक स्वरूप सेटिंग के लिए ठीक होना चाहिए।

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28T14:04:43') 
print @a 

और इस किसी भी भाषा और दिनांक स्वरूप सेटिंग्स के साथ, किसी भी एसक्यूएल सर्वर स्थापना पर काम करना चाहिए: -

तो अपने मज़बूत स्थिति में इस का उपयोग करें।

आप यूएस अंग्रेज़ी के लिए अपने मूल कोड चलाते हैं - यह ठीक से काम करेगा:

SET LANGUAGE English 

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a 

Dec 28 2012 2:04PM 

लेकिन यदि आप अपनी भाषा के रूप में इतालवी (या जर्मन, या ब्रिटिश, या फ्रेंच) का उपयोग करें, यह असफल हो जायेगी क्योंकि प्रारूप दिनांक/समय स्ट्रिंग के बीच में T बिना नहीं भाषा-स्वतंत्र और "सुरक्षित" नहीं है:

SET LANGUAGE Italian 

DECLARE @a datetime 
SET @a= CONVERT(datetime, '2012-12-28 14:04:43') 
print @a 

संदेश 242, स्तर 16, राज्य 3, रेखा 4
ला conversione di संयुक्त राष्ट्र टिपो di dati varchar में datetime हा generato संयुक्त राष्ट्र Valore गैर compreso nell'intervallo देई valori consentiti।

4

आप एक स्ट्रिंग को डेटाटाइम में बदलने की कोशिश कर रहे हैं। समस्या तारीख के साथ है। ISO format (yyyymmdd) में दिनांक स्ट्रिंग प्राप्त करने और फिर कनवर्ट करने का सबसे अच्छा तरीका है। इसे इस्तेमाल करे;

DECLARE @a datetime 
SET @a= CONVERT(datetime,replace('2012-12-28 14:04:43', '-','')) 
print @a 
+0

के अंतर्गत विफल रहता है धन्यवाद! यह काम। लेकिन मुझे नहीं पता कि मेरा कोड मेरे दोस्त के पीसी पर क्यों काम करता है। – GVillani82

+0

यह उनकी स्थानीय संस्कृति सेटिंग्स हो सकती है। – Kaf

0

मेरा अनुमान है कि आपके कंप्यूटर पर डिफ़ॉल्ट दिनांक समय प्रारूप बदल गया है। रूपांतरण विनिर्देश में पुन: शामिल करें:

SET @a= CONVERT(datetime,'2012-12-28 14:04:43', 121) 
संबंधित मुद्दे