Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

स्थानीय समय क्षेत्र के साथ Oracle टाइमस्टैम्प पारदर्शी अनुवाद को महत्व देता है

TIMESTAMP WITH LOCAL TIME ZONE इस तरह काम करता है:जब आपको अपने आवेदन में समय क्षेत्र के साथ काम करना होता है तो एक सामान्य तरीका है

ठीक इसी तरह TIMESTAMP WITH LOCAL TIME ZONE काम करता है - फर्क सिर्फ इतना है

इस कारण से आप DBTIMEZONE को नहीं बदल सकते हैं (ALTER DATABASE SET TIME_ZONE='...'; . के साथ ) अब आपके डेटाबेस पर यदि डेटाबेस में TIMESTAMP WITH LOCAL TIME ZONE वाली तालिका है कॉलम और कॉलम में डेटा होता है।

SYSTIMESTAMP डेटाबेस सर्वर के ऑपरेटिंग सिस्टम के समय क्षेत्र में वापस आ गया है। DBTIMEZONE है नहीं SYSTIMESTAMP . का समय क्षेत्र या SYSDATE .

DBTIMEZONE TIMESTAMP WITH LOCAL TIME ZONE . के आंतरिक संग्रहण प्रारूप को परिभाषित करता है डेटा प्रकार कॉलम। इसे भूल जाइए, मैं किसी भी उपयोग-मामले की कल्पना नहीं कर सकता जहाँ आपको इसकी आवश्यकता होगी।

वास्तव में आपकी तालिका इस चयन के बराबर है:

select 
   CAST(systimestamp AS timestamp(0) with local time zone) as SYSTIMESTAMP_COL,
   CAST(sysdate AS timestamp(0) with local time zone) as SYSDATE_COL,
   CAST(current_timestamp AS timestamp(0) with local time zone) as CURRENT_TIMESTAMP_COL,
   CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0) with local time zone) as DATE_COL
from dual;

जब आप CAST({time without time zone} with local time zone) बनाते हैं तो आप किसी भी समय क्षेत्र की जानकारी के बिना दिनांक/समय मान को समय क्षेत्र के साथ दिनांक/समय मान में कनवर्ट करने का प्रयास करते हैं। सिद्धांत रूप में यह संभव नहीं है क्योंकि Oracle में समय क्षेत्र की जानकारी का अभाव है, इसलिए Oracle एक समय क्षेत्र मानता है। यदि आप इस तरह की कास्ट करते हैं तो Oracle हमेशा {समय क्षेत्र के बिना समय} पर विचार करता है जैसा कि SESSIONTIMEZONE में दिया गया है (रूपांतरण के क्षण में)।

तो CAST(sysdate AS timestamp(0) with local time zone)

. के बराबर है
CAST(FROM_TZ(TO_TIMESTAMP(SYSDATE), SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)` 

सम्मान CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0) with local time zone) मतलब

CAST(FROM_TZ(TIMESTAMP '2017-03-15 19:02:00', SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)

SYSDATE . के लिए यह वास्तव में गलत है, क्योंकि SYSDATE डेटाबेस सर्वर के ऑपरेटिंग सिस्टम के समय क्षेत्र में दिया गया है SESSIONTIMEZONE में नहीं। दूसरे के लिए यह आपके इरादे पर निर्भर करता है कि परिणाम सही है या नहीं।

SYSTIMESTAMP रिटर्न वैल्यू TIMESTAMP WITH TIME ZONE , यह हमेशा आपके वर्तमान SESSIONTIMEZONE . से स्वतंत्र होता है . लेकिन अगर आप TIMESTAMP WITH LOCAL TIME ZONE में कनवर्ट करते हैं यह निश्चित रूप से आपके वर्तमान स्थानीय समय क्षेत्र में परिवर्तित हो जाता है। आप CURRENT_TIMESTAMP . का भी उपयोग कर सकते हैं या SYSTIMESTAMP AT LOCAL जो कमोबेश यही करता है।

यह कोड

गलत लगता है। परिणाम होना चाहिए

-- SYSTIMESTAMP_COL                   15/03/2017 16:01:14
-- SYSDATE_COL                        15/03/2017 19:01:14
-- CURRENT_TIMESTAMP_COL              15/03/2017 16:01:14
-- DATE_COL                           15/03/2017 19:02:00

अंतर वैसा ही दिखता है जैसा होना चाहिए लेकिन निरपेक्ष मान "नकली" प्रतीत होते हैं (या आपके डेटाबेस के साथ कोई वास्तविक समस्या है)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java 1.4 से Java 1.5+ में माइग्रेट करते समय BigDecimal की समस्या से बचें

  2. एक्सएमएल ओरेकल:मल्टीपल चाइल्ड नोड एक्सट्रैक्ट

  3. Oracle BIND चर में एकाधिक मानों की घोषणा

  4. एक CLOB ऑब्जेक्ट का उपयोग करके कैसे विभाजित करें, और:Oracle में सीमांकक को कई रिकॉर्ड में विभाजित करें

  5. क्या पैकेज/प्रक्रिया के बाहर Oracle सहयोगी सरणी प्रकार बनाना संभव है?