जैसा कि @ गॉर्डन ने कहा था, टाइमस्टैम्प (और तिथियां) एक प्रारूप में संग्रहीत नहीं हैं, जिसे आप पहचानेंगे कि ओरेकल एक आंतरिक प्रतिनिधित्व का उपयोग करता है जिसे आपको वास्तव में जानने या जांचने की आवश्यकता नहीं है (लेकिन यह दस्तावेज है यदि आप उस तरह की रुचि रखते हैं) ।
जब आप किसी टाइमस्टैम्प को क्वेरी करते हैं तो यह आपके क्लाइंट की NLS सेटिंग्स का उपयोग करके प्रदर्शित होता है, जब तक कि आपके पास कोई ऐसा क्लाइंट न हो जो उन्हें ओवरराइड करता हो। आप जो देख रहे हैं उससे मेल खाने के लिए मैं अपना सत्र सेट कर सकता हूं:
alter session set nls_timestamp_format = 'DD-MON-RR HH.MI.SS.FF AM';
select to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_CHAR(SYSTIMESTAM
-------------------
2018-07-10 15:37:31
select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_TIMESTAMP(TO_CHAR(SYSTIMESTA
-------------------------------
10-JUL-18 03.37.31.000000000 PM
और मैं इसे बदल सकता हूं, देखें कि आप क्या देखना चाहते हैं:
alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS';
select to_timestamp(to_char(systimestamp, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') from dual;
TO_TIMESTAMP(TO_CHA
-------------------
2018-07-10 15:37:32
लेकिन आप जो कुछ भी कर रहे हैं वह टाइम ज़ोन के साथ टाइमस्टैम्प से परिवर्तित हो रहा है (जो कि systimestamp
है) है) एक स्ट्रिंग के लिए और फिर वापस टाइमस्टैम्प पर। आप समय क्षेत्र भाग, और किसी भी आंशिक सेकंड को खो रहे हैं; जो आप cast
. के साथ भी कर सकते हैं :
select cast(systimestamp as timestamp(0)) from dual;
CAST(SYSTIMESTAMPAS
-------------------
2018-07-10 15:37:32
आप अपने डिफ़ॉल्ट timestamp_tz
. के साथ समय क्षेत्र और भिन्न सेकंड देख सकते हैं प्रारूप:
select systimestamp from dual;
SYSTIMESTAMP
------------------------------------
2018-07-10 15:37:33.776469000 +01:00
और इसे एक अलग alter
. के साथ बदलें :
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS.FF3 TZH:TZM';
select systimestamp from dual;
SYSTIMESTAMP
------------------------------
2018-07-10 15:37:34.070 +01:00
यदि आप वास्तव में किसी तालिका में टाइमस्टैम्प संग्रहीत करने के बारे में बात कर रहे हैं, तो यह पूरी तरह से प्रासंगिक नहीं है, लेकिन यह दर्शाता है कि विविधताएं हैं।
अपनी तालिका में डेटा प्रकार बनाएं timestamp
(या timestamp with time zone
या timestamp with local time zone
), और केवल अंतिम संभावित क्षण में, अंतिम उपयोगकर्ता के लिए प्रस्तुति के लिए मान को एक स्ट्रिंग के रूप में स्वरूपित करने के बारे में चिंता करें।
जब आपको इसे प्रदर्शित करने की आवश्यकता हो, यदि प्रदर्शन प्रारूप आपके लिए महत्वपूर्ण है तो to_char()
का उपयोग करें एक स्पष्ट प्रारूप मास्क के साथ - यह न मानें कि आपके प्रश्नों को चलाने वाले किसी अन्य व्यक्ति की NLS सेटिंग्स समान होंगी। जैसा कि आप देख सकते हैं, आउटपुट को संशोधित करने के लिए उन्हें बदलना आसान है। (अधिकांश क्लाइंट के पास आपको डिफ़ॉल्ट सेट करने देने का एक तरीका होता है ताकि आपको वही alter
करने की आवश्यकता न पड़े हर बार जब आप कनेक्ट करते हैं तो आदेश देता है; जैसे SQL डेवलपर में, Tools->Preferences->Database->NLS) से। अगर आप हमेशा एक ही फॉर्मेट दिखाना चाहते हैं तो कुछ इस तरह इस्तेमाल करें:
select to_char(your_column, 'YYYY-MM-DD HH24:MI:SS') as column_alias
from your_table
where your_column < timestamp '2018-01-01 00:00:00'
जो एक टाइमस्टैम्प शाब्दिक का उपयोग करके कॉलम मान को फ़िल्टर किया जा रहा है (अभी भी टाइमस्टैम्प के रूप में) दिखाता है।