簡體   English   中英

以SQL轉換LDAP日期(毫秒為納秒)

[英]Convert LDAP Date in SQL (milliseconds to nanoseconds)

我正在獲取milliseconds格式的日期。

即: 1427342400000 is essentially 3/26/2015

現在,我想進一步轉換日期(以nanoseconds並在Active Directory的accountexpires屬性中傳遞此值。

將毫秒日期轉換為納秒日期的查詢是什么?

任何幫助將不勝感激。

現在我想進一步轉換日期(以納秒為單位)

好的,但是從什么時候開始換算為納秒? 看您的示例,我假設起點是'01-JAN-1970'

如果我想將日期轉換為 01-JAN-1970 以來的毫秒數 ,我可以這樣做:

SQL> SELECT to_number(SYSDATE - to_date('01-JAN-1970','DD-MON-YYYY')) * (24 * 60 * 60 * 1000) milliseconds
  2  FROM dual;

        MILLISECONDS
--------------------
       1424428022000

SQL>

現在,

1毫秒= 1000000納秒

,使用此公式,只需將其乘以date的差即可

將日期轉換為納秒:

SQL> SELECT to_number(SYSDATE - to_date('01-JAN-1970','DD-MON-YYYY')) * (24 * 60 * 60 * 1000 * 1000000) nanoseconds
  2  FROM dual;

         NANOSECONDS
--------------------
 1424428111000000000

SQL>

要將其轉換回日期:

SQL> alter session set nls_date_format='DD-MON-YYYY HH24:MI:SS';

Session altered.

SQL> SELECT TO_CHAR(to_date('1970-01-01 00','yyyy-mm-dd hh24')
  2         +
  3        (1424428111000000000 )/1000000/1000/60/60/24 , 'YYYY-MM-DD HH12:MI:SS am') nano_to_date
  4  FROM dual;

NANO_TO_DATE
----------------------
2015-02-20 10:28:31 am

SQL>

UPDATE關於TIMEZONE

最好明確提及時區。

您可以在文字本身中提及時區,也可以將其轉換為UTC並將其轉換為local timezone

請看這個答案

當您說“ 1427342400000本質上是2015年3月26日”時,它看起來像是Unix時間戳。

根據我的發現,LDAP時間戳是

1601-01-01 00:00:00 UTC以來的100納秒間隔數。

Unix時間戳是

1970-01-01 00:00:00 UTC以來的秒數(有時使用毫秒)。

我假設您獲得了Unix時間戳,並且想要轉換為LDAP時間戳。 此功能應該起作用:

CREATE OR REPLACE FUNCTION ConvertTime(unixTimestamp IN NUMBER) RETURN NUMBER IS
    timestampUTC TIMESTAMP;
    theInterval INTERVAL DAY(9) TO SECOND(9);
    epoche NUMBER;
BEGIN

    -- Convert Unix Timestamp-Number to TIMESTAMP:
    timestampUTC := (TIMESTAMP '1970-01-01 00:00:00' AT TIME ZONE 'UTC' + unixTimestamp * (INTERVAL '1' SECOND / 1000));

    -- Convert TIMESTAMP to LDAP Timestamp-Number 
    theInterval := timestampUTC - TIMESTAMP '1601-01-01 00:00:00' AT TIME ZONE 'UTC';
    epoche := EXTRACT(DAY FROM theInterval)*24*60*60 
        + EXTRACT(HOUR FROM theInterval)*60*60 
        + EXTRACT(MINUTE FROM theInterval)*60 
        + EXTRACT(SECOND FROM theInterval);
    RETURN ROUND(epoche * 1e9/100);

END ConvertTime;


SELECT TO_CHAR(ConvertTime(1427342400000), 'fm999999999999999999999') FROM dual;

130718108400000000

更新:

您可以對其進行更多的分類:

SELECT 
    TO_CHAR((1427342400000/1000 + (DATE '1970-01-01' - DATE '1601-01-01')*24*60*60) * (1e9/100), 'fm999999999999999999999') AS LDAP_TS
FROM dual;

130718160000000000

但是 ,您會得到5160秒(86分鍾)的時差,但是我不知道為什么會得到這一點。 對於兩個日期之間的間隔,時區應該沒有影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM