2016-10-04 20 views
0

SQL Developerでlinuxコマンド "date +%s%3N"を複製する必要があります。私は以下のコードサンプルを試しましたが、別の値で返します。私は運がないと広範な検索Googleを行っている。SQL Developerで合計時間をミリ秒単位で生成する

select to_char((extract(day from (systimestamp - timestamp '1970-01-01 00:00:00')) * 86400000 
+ extract(hour from (systimestamp - timestamp '1970-01-01 00:00:00')) * 3600000 
+ extract(minute from (systimestamp - timestamp '1970-01-01 00:00:00')) * 60000 
+ extract(second from (systimestamp - timestamp '1970-01-01 00:00:00')) * 1000) * 1000) unix_time 
from dual; 

等日付+%sの%3Nコマンド戻り何か:dateコマンド戻り

上記のサンプルコードのようなものを返すのに対しコードサンプルの前に実行されていたにもかかわらず、コードサンプルより長くて大きな数になります。可能であれば、究極のソリューションはOracleの直接的なユーティリティとなります。そうでない場合は、おそらくOracle内のdateコマンドを呼び出すと機能します。

+0

余計な数学がたくさんあります。なぜ個々の時間成分を抽出して、それを数秒に掛け算する必要があるのですか? http://stackoverflow.com/questions/12105691/convert-timestamp-datatype-in​​to-unix-timestamp-oracleあなたがしていることのすべては、日付「数学」の1つのビットで行うことができます。 –

+1

データベースサーバーのタイムゾーンはどのくらいですか? UNIXの時刻は '1970-01-01 00:00:00 UTC'に基づいています! –

+0

あなたは 'extract(second from ...)* 1000)* 1000'を、つまりマイクロ秒単位で作成します。それはあなたが欲しいものですか? –

答えて

0

このリンクに記載されている方法(ここではhttp://www.orafaq.com/scripts/plsql/oscmd.txt)でoscommandsを使用することになりました。以下の解決策は正しい方向への一歩でしたが、私たちが作っていたスクリプトの他の部分が問題になっていました。 oscommandsを使用することで、すべての問題が解決されました。リンクに記載されている方法を使用すると、タイプ番号

l_time := oscomm('/bin/date +%s%3N'); 

を入力するだけでした。

0

この方法を試してください。

CREATE OR REPLACE FUNCTION GetUnixTime RETURN INTEGER IS 
    dsInt INTERVAL DAY(9) TO SECOND; 
    res NUMBER; 
BEGIN 

    dsInt := CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC'; 
    res:= EXTRACT(DAY FROM dsInt)*24*60*60 
     + EXTRACT(HOUR FROM dsInt)*60*60 
     + EXTRACT(MINUTE FROM dsInt)*60 
     + EXTRACT(SECOND FROM dsInt); 
    RETURN ROUND(1000*res); 
END GetUnixTime; 

ROUND(1000*res)は、あなたの質問に応じて、あなたがミリ秒、マイクロあるいはナノ秒取得したいかどうかは明らかではないが、ミリ秒でUnixの時間を返します。しかし、結果を希望の値に変更する方法は非常に明白です。この関数はUnixエポックのローカルタイムゾーンと時間帯を考慮し

(常にUTCです)

あなたは機能が気に入らない場合、あなたはもちろんのクエリでそれを書くことができます:

SELECT 
    ROUND(EXTRACT(DAY FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*24*60*60 
     + EXTRACT(HOUR FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*60*60 
     + EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*60 
     + EXTRACT(SECOND FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC') 
    * 1000) AS unix_time 
FROM dual; 
関連する問題