डेटटाइम सम्मिलित करते समय वर्ण स्ट्रिंग से दिनांक और / या समय परिवर्तित करते समय रूपांतरण विफल रहा


164

मैं निम्नानुसार एक तालिका बनाने की कोशिश कर रहा था,

create table table1(date1 datetime,date2 datetime);

पहले मैंने नीचे के रूप में मान डालने की कोशिश की,

insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');

यह कहते हुए त्रुटि हुई है,

Varchar को datetime में नहीं बदल सकते

फिर मैंने हमारे स्टैकओवरफ़्लो द्वारा सुझाए गए पोस्ट में से एक के रूप में नीचे प्रारूप की कोशिश की,

insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
                          ,convert(datetime,'01-01-2001 12:00:00 AM',5));

लेकिन मुझे अभी भी यह कहते हुए त्रुटि हो रही है,

चरित्र स्ट्रिंग से दिनांक और / या समय परिवर्तित करते समय रूपांतरण विफल रहा

कोई सुझाव?


2
@Damien_The_Unbeliever जैसा कि आपने कहा कि मैंने यह प्रश्न पूछने से पहले ही इस पोस्ट stackoverflow.com/questions/12957635/… का उल्लेख कर दिया है । उन्होंने हमें 'इंसर्ट टेबल 1 (अनुमोदन) मान (कन्वर्ट (डाइमटाइम,' 18 -06-12 10:34:09 PM ', 5)) का उपयोग करने के लिए कहा; लेकिन यह काम नहीं करता है
मारी

जवाबों:


163

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

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

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

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

या:

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

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

तो अपने ठोस मामले में - इन तारों का उपयोग करें:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

और आपको ठीक होना चाहिए (ध्यान दें: आपको अंतर्राष्ट्रीय उपयोग करने की आवश्यकता है 12-घंटे AM / PM प्रारूप के बजाय 24-घंटे के प्रारूप )।

वैकल्पिक रूप से : यदि आप SQL Server 2008 या नए पर हैं, तो आप DATETIME2डेटाटाइप (सादे के बजाय DATETIME) का उपयोग भी कर सकते हैं और आपका करंट INSERTबिना किसी समस्या के काम करेगा! :-)DATETIME2 रूपांतरण पर बहुत बेहतर और बहुत कम अचार है - और यह वैसे भी SQL Server 2008 या नए के लिए डेट / टाइम डेटा प्रकारों की सिफारिश है।

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

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


1
एक नोट के रूप में, DATETIME2 के रूप में कास्टिंग भी 'YYYY-MM-DDTHH: MM: SSZ' (नोट 'Z' के साथ काम करता है - UTC टाइमस्टैम्प को निरूपित करने के लिए अंत में ज़ुलु समय)। मुझे यह त्रुटि '2013-12-16T17: 21: 26Z' डेटाटाइम क्षेत्र में सम्मिलित करने की कोशिश करते समय मिली है। बस स्पष्ट करने के लिए, आईएसओ 8601 आंशिक रूप से समर्थित है। यह ज़ूलू समय का समर्थन नहीं करता है, इसके बावजूद इसे प्रलेखन में उल्लेख किया गया है। यह शायद कुछ सेटिंग है जो मुझे पता लगाने का समय नहीं है, लेकिन अगर किसी को एक ही समस्या है, तो इसे ध्यान में रखें।
माइकेल

3
मैं पुष्टि कर सकता हूं कि 'YYYYMMDD' तिथि प्रारूप ठीक काम करता है, इसे SQL सर्वर 2014 पर आजमाया, एक शाब्दिक तिथि निर्दिष्ट करने के तरीके के रूप में। कई टैंकों
@marc_s

1
DATETIME2 चीज ने मेरे लिए काम किया। मेरे मामले में मैं अंग्रेजी में SQLServer से एक डेटाबेस स्क्रिप्ट आयात कर रहा था, इसके एक स्पेनिश संस्करण में, इसलिए हर बार एक ही त्रुटि। मैंने बस स्क्रिप्ट में "DATETIME2" के रूप में "DATETIME" के रूप में सभी त्रुटियों को हल किया और समस्या हल हो गई।
अलेजांद्रो डेल रीओ

24

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

उदाहरण:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

SQL सर्वर निम्न त्रुटि को फेंक देगा:

Conversion failed when converting date and/or time from character string.

इस त्रुटि का कारण केवल वर्ष (2015) में ऐसी कोई तारीख (फरवरी -29) नहीं है।


2
"इस त्रुटि का कारण केवल वर्ष (2015) में ऐसी कोई तारीख (फरवरी -29) नहीं है" यह वास्तव में यही कारण था कि मुझे यह त्रुटि मिल रही थी। यह उत्तर इस त्रुटि के सबसे सामान्य कारण को ध्यान में रखता है, अन्य उत्तर नहीं थे।
फर्स्टफ्राटल सेप

1
मैंने एक एक्सेल शीट से डेटा आयात किया, जहां शून्य मान वास्तव में सेल में "NULL" था। यह DB तालिका में "Null" स्ट्रिंग के रूप में सेट हो गया, इसलिए स्ट्रिंग "Null" को डेटाइम में बदलने की कोशिश कर रहा था। एक्सेल में "NULL" सेल को खाली कर देना चाहिए था। मैं एक बेवकूफ हूँ: /
karol

17

सरल उत्तर - 5 इतालवी "yy" है और 105 इतालवी "yyyy" है। इसलिए:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

सही ढंग से काम करेंगे, लेकिन

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

त्रुटि देगा।

इसी तरह,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

त्रुटि देगा, जहां के रूप में

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

काम करेगा।


8

बस दिनांक प्रारूप को अद्यतन करें जैसे कि bellow

yyyy-MM-dd hh:MM:ss

यह मेरे लिए समस्या का हल करता है और यह ठीक काम करता है


2
कृपया पहले से दिए गए अन्य उत्तर पढ़ें। यह प्रारूप आपके सत्र DATEFORMATसेटिंग के कारण ही आपके लिए काम करता है । इसे चलाकर सत्यापित करें SET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);। यदि आप एक Tविभाजक ( yyyy-MM-ddTHH:mm:ss) जोड़ते हैं तो यह मज़बूती से काम करेगा ।
डैन गुज़मैन

1
बहुत बहुत धन्यवाद हाँ आप सही हैं यह मेरी समस्या का हल करता है और मैंने यहाँ दिए गए अन्य उत्तर पढ़े
Pronab Roy

8

जब भी संभव हो संस्कृति विशिष्ट तिथि / समय शाब्दिक से बचना चाहिए

शाब्दिक के रूप में दिनांक / समय प्रदान करने के लिए कुछ सुरक्षित प्रारूप हैं:

के लिए सभी उदाहरण 2016-09-15 17:30:00

ODBC (मेरा पसंदीदा, क्योंकि इसे तुरंत वास्तविक प्रकार के रूप में संभाला जाता है )

  • {ts'2016-09-15 17:30:00'} - समय टिकट
  • {d'2016-09-15'} - केवल डाइट करें
  • {t'17:30:00'} - केवल समय

ISO8601 ( हर जगह के लिए सबसे अच्छा )

  • '2016-09-15T17:30:00'- बीच में पता नहीं T!

अनपेक्षित (संख्या के रूप में गलत व्याख्या करने के लिए छोटा जोखिम)

  • '20160915' - शुद्ध तिथि के लिए

ध्यान में रखने के लिए अच्छा है: अमान्य तिथियां अजीब त्रुटियों के साथ दिखाई देती हैं

  • 31 जून या 30 फरवरी की कोई तारीख नहीं है ...

अजीब रूपांतरण त्रुटियों का एक और कारण: निष्पादन का आदेश!

SQL- सर्वर निष्पादन के क्रम में चीजों को करने के लिए अच्छी तरह से जानता है जिसकी किसी ने उम्मीद नहीं की होगी। आपका लिखित विवरण ऐसा लगता है कि रूपांतरण कुछ प्रकार से संबंधित कार्रवाई होने से पहले किया जाता है, लेकिन इंजन तय करता है - कभी क्यों - बाद के चरण में रूपांतरण करने के लिए।

यहाँ उदाहरणों के साथ यह समझाने वाला एक शानदार लेख है: Rusano.com: "t-sql-functions-do-no-imply-a-निश्चित-क्रम-निष्पादन" और यहाँ संबंधित प्रश्न है


3

सबसे अच्छा तरीका है यह कोड

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,

1
यदि आप प्रारंभिक स्थानों के बजाय बैकटिक्स का उपयोग करते हैं, तो आपको वर्ड-रैपिंग मिलेगी।
जेसी डब्ल्यू पर जेड -

2

डेटाटाइम प्रारूप वास्तव में SQL सर्वर पर चलता है

yyyy-mm-dd hh:MM:ss

1
नहीं, यह सच नहीं है (के बेमेल के अलावा mऔर M)। प्रोनाब रॉय के जवाब में डैन गुज़मैन की टिप्पणी पढ़ें और यहाँ अन्य उत्तर पढ़ें ...
Shnugo

2

कृपया इसे आजमाएँ।

SQL सर्वर MM / DD / YYYY प्रारूप में तारीखों की अपेक्षा करता है, यदि अंग्रेजी को आपकी डिफ़ॉल्ट भाषा के रूप में सेट किया गया है। मैं sql2008 डेटाबेस के लिए datepicker मान की बचत कर रहा हूं। मेरा डेटाबेस प्रकार डेटाबेस में डेटाइम है।

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

अब अपने इन्सर्ट क्वेरी में dob का उपयोग करें।


1

आप इस कोड को आज़मा सकते हैं

select (Convert(Date, '2018-04-01'))

1

मुझे यह मुद्दा तब मिला, जब हमने सहमति बनाने की कोशिश की getdate() मैं एक स्ट्रिंग में घुसने की रहा था जिसे मैं एक nvarchar फ़ील्ड में सम्मिलित कर रहा था।

मैंने इसे पाने के लिए कुछ कास्टिंग की:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

यह एक पवित्र उदाहरण है। इसका मुख्य भाग यह है:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

तारीख को कास्ट किया datetime2, फिर nvarcharइसे संक्षिप्त करने के लिए।



0

web.config फ़ाइल से अंग्रेजी में संस्कृति सेट करें

  <globalization uiCulture="en-US" culture="en-US" />

उदाहरण के लिए यदि आप संस्कृति को अरबी के लिए निर्धारित करते हैं तो चोर होगा

22/09/2017 02:16:57 02:

और आपको त्रुटि मिलती है: डेटटाइम सम्मिलित करते समय चरित्र स्ट्रिंग से दिनांक और / या समय परिवर्तित करते समय रूपांतरण विफल रहा



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.