2012-05-01 16 views
14
declare @str_datetime varchar(50) 
set @str_datetime='30-04-2012 19:01:45' -- 30th April 2012 
declare @dt_datetime datetime 
select @[email protected]_datetime 

यह दे रहा है निम्न त्रुटि:एसक्यूएल सर्वर अंतर्निहित डेटाटाइम रूपांतरण के लिए प्रारूप कैसे तय करता है?

Msg 242, Level 16, State 3, Line 4
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

मेरा प्रश्न कैसे एसक्यूएल सर्वर जो प्रारूप निहित datetime रूपांतरण के लिए उपयोग करने का फैसला है?

उत्तर

23

यह विभिन्न कारकों पर निर्भर हो सकता है - ऑपरेटिंग सिस्टम की क्षेत्रीय सेटिंग्स, वर्तमान उपयोगकर्ता की भाषा और डेटफॉर्मेट सेटिंग्स। डिफ़ॉल्ट रूप से, विंडोज US English का उपयोग करता है, और उपयोगकर्ता की सेटिंग्स US English और MDY हैं।

लेकिन यहां कुछ उदाहरण दिए गए हैं कि यह कैसे दिखाया जा सकता है।

उपयोगकर्ता ब्रिटिश भाषा सेटिंग्स का उपयोग कर रहा है:

-- works: 
SET LANGUAGE BRITISH; 
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45'); 

-- fails: 
SELECT CONVERT(DATETIME, '04/13/2012'); 
GO 

(त्रुटि)

Msg 242, Level 16, State 3, Line 5
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

उपयोगकर्ता Français उपयोग कर रहा है:

-- works: 
SET LANGUAGE FRENCH; 
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45'); 

-- fails: 
SELECT CONVERT(DATETIME, '04/13/2012'); 
GO 

(त्रुटि)

Msg 242, Level 16, State 3, Line 1
La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.

उपयोगकर्ता फिर Français उपयोग कर रहा है:

SET LANGUAGE FRENCH; 

-- fails (proving that, contrary to popular belief, YYYY-MM-DD is not always safe): 
SELECT CONVERT(DATETIME, '2012-04-30'); 
GO 

(त्रुटि)

Msg 242, Level 16, State 3, Line 1
La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.

उपयोगकर्ता MDY के बजाय DMY उपयोग कर रहा है:

SET LANGUAGE ENGLISH; 
SET DATEFORMAT DMY; 

-- works: 
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45'); 

-- fails: 
SELECT CONVERT(DATETIME, '04-30-2012'); 
GO 

(त्रुटि)

Msg 242, Level 16, State 3, Line 2
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

आपकी सर्वश्रेष्ठ शर्त, हमेशा आईएसओ मानक, गैर-क्षेत्रीय, सुरक्षित, स्पष्ट तारीख प्रारूपों का उपयोग करना है। दो मैं आम तौर पर की सिफारिश कर रहे हैं: इनमें से

YYYYMMDD     - for date only. 
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important. 

कोई भी असफल:

SET DATEFORMAT MDY; 
SET LANGUAGE ENGLISH; 
SELECT CONVERT(DATETIME, '20120430'); 
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45'); 
SET LANGUAGE FRENCH; 
SELECT CONVERT(DATETIME, '20120430'); 
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45'); 
SET LANGUAGE BRITISH; 
SELECT CONVERT(DATETIME, '20120430'); 
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45'); 
SET DATEFORMAT DMY; 
SELECT CONVERT(DATETIME, '20120430'); 
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45'); 

इसलिए, मैं दृढ़ता से बजाय और उपभोक्ताओं को मुक्त पाठ तिथि प्रारूप में टाइप (की कि सलाह देते हैं या कि आप अविश्वसनीय प्रारूपों खुद का उपयोग), अपने इनपुट स्ट्रिंग को नियंत्रित करें और सुनिश्चित करें कि वे इन सुरक्षित प्रारूपों में से किसी एक का पालन करते हैं। फिर इससे कोई फर्क नहीं पड़ता कि उपयोगकर्ता के पास कौन सी सेटिंग्स हैं या अंतर्निहित क्षेत्रीय सेटिंग्स क्या हैं, आपकी तिथियों का हमेशा उन तिथियों के रूप में व्याख्या किया जाएगा जिनकी वे इरादा रखते थे।यदि आप वर्तमान में उपयोगकर्ताओं को किसी फॉर्म पर टेक्स्ट फ़ील्ड में तिथियां दर्ज करने दे रहे हैं, तो ऐसा करना बंद करें और कैलेंडर नियंत्रण लागू करें या कम से कम एक पिक सूची लागू करें ताकि आप अंततः SQL सर्वर पर वापस भेजे गए स्ट्रिंग प्रारूप को नियंत्रित कर सकें।

कुछ पृष्ठभूमि के लिए, कृपया तिबोर Karaszi के "The ultimate guide to the datetime datatypes" और मेरी पोस्ट "Bad Habits to Kick : Mis-handling date/range queries."

+0

मेरा उत्तर देखें [यहां] (http://stackoverflow.com/a/23369706/2108149) उपयोगकर्ता परिभाषित फ़ंक्शन के भीतर इसे कैसे करें। –

+2

@Eli मुझे लगता है कि आप उस बिंदु को खो रहे हैं जिसे मैं बनाने की कोशिश कर रहा था। यदि एक व्यक्ति इंग्लैंड में है और एक स्ट्रिंग '0 9/04/2014 'पास करता है और दूसरा व्यक्ति संयुक्त राज्य अमेरिका में है और '0 9/04/2014' पास करता है, तो आपका कार्य जादुई रूप से कैसे पता चलता है कि उनमें से कौन सा 9 अप्रैल का मतलब था और कौन सा 4 सितंबर का मतलब था? –

+0

मुझे यह स्वीकार करना होगा कि मैंने आपके पूरे धागे को पढ़ा नहीं है, मैं एक महीने का अनुवाद समाधान ढूंढ रहा था और जब मैं इसे खोज रहा था, तो मैं आपके उत्तर में आया, इसलिए मैंने सोचा कि कुछ लोगों को यह उपयोगी लगेगा ... –

1

By default, the date format for SQL server is in U.S. date format MM/DD/YY, unless a localized version of SQL Server has been installed. This setting is fine for cases when an application that requires this functionality is deployed in a manner guaranteeing that dates are used and inserted in the same format across all platforms and locations where the application is used.

However, in some cases the date must be in a DD/MM/YY format because many countries/regions use this format rather than the U.S. default of MM/DD/YY. This is especially an issue for international applications that are distributed all over the world.

Source

तो तुम तुम क्या करने की जरूरत दिनांक स्वरूप हाथ के रूप में तो इससे पहले कि सेट है:

SET DATEFORMAT dmy 
GO 

और फिर आपकी क्वेरी काम करेंगे।

+0

... जब तक कोई अलग प्रारूप का उपयोग नहीं करता है। –

+1

@AaronBertrand सही। क्या एसक्यूएल पर इसे संभालने के लिए कोई अचूक दृष्टिकोण है? मेरा मतलब है, किसी भी प्रारूप पर किसी तारीख का प्रतिनिधित्व करने वाली स्ट्रिंग प्राप्त करना और बिना किसी ग़लत तर्क के रूपांतरण को सुरक्षित रूप से बनाना? – Icarus

+1

नहीं, ऐसा नहीं है। आपको इनपुट स्ट्रिंग को नियंत्रित करने की आवश्यकता है। यदि कोई उपयोगकर्ता '05/06/2012' पास करता है, क्योंकि उन्हें किसी भी प्रारूप में टाइप करने की अनुमति थी, तो SQL सर्वर विश्वसनीय रूप से यह निर्धारित कर सकता है कि उपयोगकर्ता 6 मई या 5 जून का मतलब है या नहीं? –

1

तुम भी डी प्रत्येक लॉगिन और/या के लिए प्रत्येक भविष्य लॉगिन जोड़ा (जरूरतों के बिना के लिए डिफ़ॉल्ट दिनांक स्वरूप को बदल सकते हैं करने के लिए "DateFormat SET" पढ़ें प्रत्येक सत्र

में। आप एसक्यूएल प्रबंधन स्टूडियो/सुरक्षा/लॉगिन में जाना। राइट-CLIC लॉगिन, फिर गुण। आप "डिफ़ॉल्ट भाषा" तल पर दिखाई देगा।

क्या आप वाकई किसी भी बनाना चाहते हैं भविष्य में जोड़े गए लॉग इन "अच्छी" भाषा प्राप्त करते हैं। आप राइट-क्लिक करें अपने सर्वर रूट पर, फिर गुण और उन्नत पृष्ठ। वहां एक विकल्प "डिफ़ॉल्ट भाषा" भी है जिसका उपयोग नव निर्मित लॉग इन के लिए किया जाता है।

+0

आप यहां सिर्फ "धन्यवाद" टिप्पणी नहीं करनी चाहिए .... लेकिन मुझे इसकी आवश्यकता है, इसलिए: धन्यवाद। – Steen

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

  • कोई संबंधित समस्या नहीं^_^