![](/img/trans.png)
[英]Convert milliseconds to Date in SQL Server for date after 01/01/2040
[英]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.