2009年2月28日星期六

Oracle下Unix epoch timestamp與Date互換

在*nix環境下使用Oracle的date,又或者在Java裡使用epoch時間與Oracle的date互換,的確是件很麻煩的事。
以下是一些解決方法,不過單是一個時間就把query弄得長長的。


從Unix的epoch timestamp轉成Oracle的date:


SELECT (TO_DATE('19700101000000','YYYYMMDDHH24MISS')+NUMTODSINTERVAL(10,'SECOND')) AS oracle_datetime FROM dual;

請留意紅色那個數字,把您的Unix timestamp換上去。

從Oracle的date轉成Unix的epoch timestamp:

SELECT (SYSDATE - TO_DATE('01011970000000' , 'ddmmyyyyhh24miss')) * 86400 AS epoch_timpstamp FROM dual;

請留意紅色那個SYSDATE,SYSDATE是系統時間,這裡換上您的Oracle date的field。

除此,在下還自行編寫了兩個簡單的user-defined function來做轉換,總比這麼長長的好。


date轉成Unix timestamp:

CREATE OR REPLACE FUNCTION date2epoch(input IN DATE) RETURN NUMBER IS
BEGIN
RETURN ((input - TO_DATE('01011970000000' , 'ddmmyyyyhh24miss')) * 86400);
END date2epoch;

用法:
SELECT date2epoch(sysdate) FROM dual;

Unix timestamp轉成date:

CREATE OR REPLACE FUNCTION epoch2date(input IN NUMBER) RETURN DATE IS
BEGIN
RETURN (TO_DATE('19700101000000','YYYYMMDDHH24MISS')+NUMTODSINTERVAL(input,'SECOND'));
END epoch2date;

用法:
SELECT epoch2date(1234567890) AS oracle_datetime FROM dual;

沒有留言:

發佈留言