यह विभिन्न कारकों पर निर्भर हो सकता है - ऑपरेटिंग सिस्टम की क्षेत्रीय सेटिंग्स, वर्तमान उपयोगकर्ता की भाषा और दिनांक स्वरूप सेटिंग्स। डिफ़ॉल्ट रूप से, विंडोज़ 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
(त्रुटि)
उपयोगकर्ता Français का उपयोग कर रहा है:
-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(त्रुटि)
उपयोगकर्ता फिर से 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
(त्रुटि)
उपयोगकर्ता 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
(त्रुटि)
आपका सबसे अच्छा दांव, हमेशा, आईएसओ मानक, गैर-क्षेत्रीय, सुरक्षित, स्पष्ट दिनांक स्वरूपों का उपयोग करना है। मैं आमतौर पर जिन दो की अनुशंसा करता हूं वे हैं:
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 सर्वर पर वापस भेजे गए स्ट्रिंग प्रारूप को नियंत्रित कर सकें।
कुछ पृष्ठभूमि के लिए, कृपया Tibor Karaszi की "डेटाटाइम की अंतिम मार्गदर्शिका पढ़ें। डेटाटाइप" और मेरी पोस्ट "खराब किक करने की आदत :दिनांक / श्रेणी प्रश्नों को गलत तरीके से संभालना।"