यह विभिन्न कारकों पर निर्भर हो सकता है - ऑपरेटिंग सिस्टम की क्षेत्रीय सेटिंग्स, वर्तमान उपयोगकर्ता की भाषा और डेटफॉर्मेट सेटिंग्स। डिफ़ॉल्ट रूप से, विंडोज 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."
मेरा उत्तर देखें [यहां] (http://stackoverflow.com/a/23369706/2108149) उपयोगकर्ता परिभाषित फ़ंक्शन के भीतर इसे कैसे करें। –
@Eli मुझे लगता है कि आप उस बिंदु को खो रहे हैं जिसे मैं बनाने की कोशिश कर रहा था। यदि एक व्यक्ति इंग्लैंड में है और एक स्ट्रिंग '0 9/04/2014 'पास करता है और दूसरा व्यक्ति संयुक्त राज्य अमेरिका में है और '0 9/04/2014' पास करता है, तो आपका कार्य जादुई रूप से कैसे पता चलता है कि उनमें से कौन सा 9 अप्रैल का मतलब था और कौन सा 4 सितंबर का मतलब था? –
मुझे यह स्वीकार करना होगा कि मैंने आपके पूरे धागे को पढ़ा नहीं है, मैं एक महीने का अनुवाद समाधान ढूंढ रहा था और जब मैं इसे खोज रहा था, तो मैं आपके उत्तर में आया, इसलिए मैंने सोचा कि कुछ लोगों को यह उपयोगी लगेगा ... –