2017-03-16 35 views
-4

我需要將sysdate轉換爲oracle中的13位數字(Unix時間戳編號)。 請爲此共享sql。將sysdate轉換爲13位數字oracle sql

例如:1486015200000 日期:2017年2月2日

的號碼參考,使用1486015200000以下鏈接 http://www.timestampconvert.com/

+0

請張貼的例子。如果當前時間是3/16/2017 3:52:PM EST,那麼13位數字會是什麼,爲什麼? –

+0

日期:02/02/2017 number:1486015200000 – dreambigcoder

+0

這是爲什麼那個日期? –

回答

0

原則上這是很簡單:以任何日期。減去日期文字date '1970-01-01'。將括號中的差值括起來並乘以86400000.

即:日期差異(在Oracle中)以天爲單位。一天有24 * 24 * 60 = 86,400秒和86,400,000毫秒。 13位數的「unix時間」是1970年1月1日午夜以來經過的毫秒數。

您鏈接到已關閉6小時在網站上計算,所以我假定你在美國中央時區住的地方(或者是其他地方在同一個時區,在北美或中美或南美)。該網站假設輸入是在您的時區。在Oracle中,日期是抽象的,它們不是「在時區中」。

select sysdate, (sysdate - date '1970-01-01') * 86400000 as unix_time from dual; 

SYSDATE    UNIX_TIME 
------------------- ------------- 
03/16/2017 15:17:32 1489677452000 
+0

只有當您的數據庫服務器在UTC時區上運行時,此查詢纔會返回正確的結果,否則它是錯誤的。在這種情況下,您必須首先將「sysdate」轉換爲UTC(或將'1970-01-01 00:00:00 UTC'轉換爲當地時間) –

+0

網頁http://www.timestampconvert.com/進行正確的轉換,它表示預計當地時間。當我(住在歐洲)輸入Unix時間'00'時,我得到'1970-01-01 01:00:00'當地時間'1970-01-01 00:00:00 UTC' –

+0

@ WernfriedDomscheit - 我同意網站做出正確的轉換。我的觀點(我應該更加明確)是將Oracle日期轉換爲Unix時間的整個概念是無效的。 Unix時間是「在特定的時區」。 Oracle日期不是。根據服務器時區轉換Oracle日期絕對沒有意義; Oracle日期與服務器時區或任何其他時區無關。什麼是合理的是在Unix時間和Oracle時間戳之間進行轉換(或使用本地時區)。 – mathguy

0

這應該工作:

SELECT (COLUMN_WITH_ORACLE_DATE_VALUE - TO_DATE('1970-01-01', 'YYYY-MM-DD')) * 86400000 FROM DUAL; 

例如:

SELECT (TO_DATE('02/02/2017','MM/DD/YYYY') - TO_DATE('01/01/1970', 'MM/DD/YYYY')) * 86400000 FROM DUAL; 
1

UNIX產生的時間戳的方式,這是自一月的午夜協調世界時(UTC)經過的秒數1,1970.

您應該可以使用

select (
    timestamp '1970-01-01 00:00:00 GMT' + numtodsinterval(1486015200000 /1000, 'SECOND')) 
    at LOCAL 
from dual; 

NUMTODSINTERVAL doc

+0

可能考慮時區的唯一正確答案。不過,我認爲這個問題是相反的。 –

+0

@WernfriedDomscheit - 我不明白關於「時區」的評論。我的答案肯定包含對此的評論 - 並且還指出,在Oracle中,DATE數據類型不包含有關「時區」的信息,所以我不確定您的意思。 – mathguy