NLS_TIMESTAMP_FORMAT को बदलने का परिणाम


4

मैं एक 9.2.0.8 डेटाबेस को प्रशासित करता हूँ जहाँNLS_TIMESTAMP_FORMATइस पर लगा है'DD-MON-RR HH.MI.SSXFF AM';

इसका उपयोग करते समय विषम परिणाम होते हैंCAST TO TIMESTAMPसमारोह:

select CAST('14-SEP-2011' AS TIMESTAMP) "DATE" from dual;
----------
14-SEP-2020 11:00:00.000000 AM 

अगर मैं बदलूंNLS_TIMESTAMP_FORMATसेवा मेरे'DD-MON-YYYY HH.MI.SSXFF AM'तब मैं जाने के लिए अच्छा हूं।

बदल जाएगाNLS_TIMESTAMP_FORMATकरने के लिए डेटाबेस पर पैरामीटरYYYYकोई परिणाम है?

4

डेटाबेस स्तरNLS_DATE_FORMATतथाNLS_TIMESTAMP_FORMATपैरामीटर विशेष रूप से उपयोगी नहीं हैं क्योंकि वे हमेशा क्लाइंट सेटिंग्स द्वारा ओवरराइड होते हैं।इसलिए, भले ही आप डेटाबेस सेटिंग बदलते हों, 99 +% उस समय जब कोई उपयोगकर्ता साथ आता है और डेटाबेस से जुड़ता है, तो उनका सत्र एक सेट होता हैNLS_DATE_FORMATतथाNLS_TIMESTAMP_FORMATग्राहक के आधार परNLS_LANGया अन्य राष्ट्रीय भाषा सेटिंग्स (यानी पतले JDBC ड्राइवर का उपयोग करने वाले एप्लिकेशन क्लाइंट पर निर्भर होने के बजाय JVM की अंतर्राष्ट्रीयकरण सेटिंग का उपयोग करते हैंNLS_LANG) और डेटाबेस में आपके द्वारा की गई सेटिंग को ओवररेल करें।डेटाबेस के उपयोग से जुड़े कुछ कोने मामले हैंDBMS_JOBSयाDBMS_SCHEDULERजहाँ कोई क्लाइंट नहीं है जहाँ डेटाबेस हैNLS_DATE_FORMATतथाNLS_TIMESTAMP_FORMATउपयोग किया जाता है, मुझे विश्वास है, लेकिन वे दुर्लभ हैं।

आप एक लॉगिन ट्रिगर बना सकते हैं जिसने एALTER SESSIONसेट करने के लिएNLS_DATE_FORMATतथाNLS_TIMESTAMP_FORMATआपके सत्रों के लिए।जब वह सत्र बनाया जाता है, तो ग्राहक द्वारा अनुरोधित सेटिंग्स को हटा दिया जाएगा।जैसा कि निक बताते हैं, आपको यह चिंता करनी होगी कि निहितार्थ के लिए वर्तमान सेटिंग पर अन्य प्रश्न निर्भर हैं और आपका परिवर्तन उस कोड को तोड़ सकता है।

सामान्य तौर पर, आप जहां भी संभव हो, निहितार्थ से बचने के लिए बहुत बेहतर होते हैं, लेकिन विशेष रूप से जब यह तार को तारीखों और टाइमस्टैम्प से बदलने के लिए आता है, क्योंकि बहुत सारे अलग-अलग प्रारूप हैं जो आप समस्याओं के लिए खुद को स्थापित कर रहे हैं।यदि आप अपने कोड में एक तारीख शाब्दिक निर्दिष्ट करना चाहते हैं, तो आप ANSI दिनांक और टाइमस्टैम्प सिंटैक्स का उपयोग करके बहुत बेहतर हैं

SQL> ed
Wrote file afiedt.buf

    1 select cast( date '2011-09-14' as timestamp ) dt,
    2     timestamp '2011-09-14 13:15:30' ts
    3*  from dual
SQL> /

DT               TS
------------------------------ -----------------------------------
14-SEP-11 12.00.00.000000 AM  14-SEP-11 01.15.30.000000000 PM

यदि आप किसी स्ट्रिंग को किसी दिनांक या टाइमस्टैम्प में परिवर्तित करना चाहते हैं, तो आप एक का उपयोग करके बेहतर हैंTO_DATEया एTO_TIMESTAMPएक स्पष्ट प्रारूप मुखौटा के साथ।


0

मौजूदा क्वेरी जो इस प्रारूप पर निर्भर करती हैं, विभिन्न परिणाम दे सकती हैं।

जांचें कि क्या आपका मौजूदा कोड TIMESTAMP फ़ील्ड को इस तरह से व्याख्या करता है जो प्रारूप-निर्भर है, और यदि ऐसा होता है तो इसे अपडेट करना सुनिश्चित करें।यह भी ध्यान दें कि NLS_TIMESTAMP_FORMAT डेटाबेस या क्लाइंट स्तर पर सेट किया जा सकता है, इसलिए एक ग्राहक कोड को निष्पादित करते समय क्या प्रारूप देखता है, इस पर ध्यान दें।