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

Oracle में स्थानीय डेटाटाइम (समय क्षेत्र के साथ) को यूनिक्स टाइमस्टैम्प में बदलें

आप अपने टाइमस्टैम्प को टाइमज़ोन के साथ यूटीसी में बदल सकते हैं, और फिर उसमें से युग को घटा सकते हैं:

select timestamp '2018-10-19 09:12:47.0 AMERICA/DENVER'
  - timestamp '1970-01-01 00:00:00.0 UTC' as diff
from dual;

जो आपको एक अंतराल डेटा प्रकार देता है:

DIFF                  
----------------------
+17823 15:12:47.000000

फिर आप उसमें से तत्वों को निकाल सकते हैं, और प्रत्येक तत्व को मिलीसेकंड में बदलने के लिए एक उपयुक्त कारक से गुणा कर सकते हैं (यानी दिनों के लिए, 60*60*24*1000); और फिर उन्हें एक साथ जोड़ें:

select extract(day from diff) * 86400000
  + extract(hour from diff) * 3600000
  + extract(minute from diff) * 60000
  + extract(second from diff) * 1000 as unixtime
from (
  select timestamp '2018-10-19 09:12:47.0 AMERICA/DENVER'
    - timestamp '1970-01-01 00:00:00.0 UTC' as diff
  from dual
);

            UNIXTIME
--------------------
       1539961967000

db<>fiddle

यह मिलीसेकंड को भी सुरक्षित रखता है, अगर शुरुआती टाइमस्टैम्प उनके पास है (यह उन्हें संरक्षित करते हुए 'यूनिक्स' समय से परिवर्तित होता है):

select (timestamp '1970-01-01 00:00:00.0 UTC' + (1539961967567 * interval '0.001' second))
  at time zone 'America/Denver' as denver_time
from dual;

DENVER_TIME                                 
--------------------------------------------
2018-10-19 09:12:47.567000000 AMERICA/DENVER

फिर वापस कनवर्ट करने के लिए:

select extract(day from diff) * 86400000
  + extract(hour from diff) * 3600000
  + extract(minute from diff) * 60000
  + extract(second from diff) * 1000 as unixtime
from (
  select timestamp '2018-10-19 09:12:47.567 AMERICA/DENVER'
    - timestamp '1970-01-01 00:00:00.0 UTC' as diff
  from dual
);

            UNIXTIME
--------------------
       1539961967567

db<>fiddle

यदि आपके शुरुआती टाइमस्टैम्प में उससे अधिक सटीकता है तो आपको गैर-पूर्णांक परिणाम से बचने के लिए (या गोल/मंजिल/छत/कास्ट) को छोटा करना होगा; यह संस्करण केवल निकाले गए मिलीसेकंड भाग को छोटा कर देता है:

select diff,
  extract(day from diff) * 86400000
  + extract(hour from diff) * 3600000
  + extract(minute from diff) * 60000
  + trunc(extract(second from diff) * 1000) as unixtime
from (
  select timestamp '2018-10-19 09:12:47.123456789 AMERICA/DENVER'
    - timestamp '1970-01-01 00:00:00.0 UTC' as diff
  from dual
);

DIFF                                  UNIXTIME
------------------------- --------------------
+17823 15:12:47.123456789        1539961967123

उस छंटनी (या समकक्ष) के बिना आप 1539961967123.456789 के साथ समाप्त हो जाएंगे ।

मैं लीप सेकंड विसंगति के बारे में भूल गया था; यदि आप इसे संभालना चाहते/चाहते हैं, यह उत्तर देखें



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MERGE स्टेटमेंट में कई कॉलम अपडेट करें ORACLE

  2. क्लॉब वेरिएबल लाइन को लाइन से पढ़ना

  3. ऑरैकल में कॉलम संशोधित करें - कैसे जांचें कि कोई कॉलम शून्य करने योग्य होने से पहले शून्य है या नहीं?

  4. जेपीए निराशावादी ताला काम नहीं कर रहा

  5. जहां क्लॉज . में कुल कार्यों की अनुमति क्यों नहीं है?