1

以前はかなり最近のデータ (1960 年代から現在まで) があった開始時刻と終了時刻のデータベースがあり、長い整数として格納できました。これは unix タイムスタンプに非常に似ており、ミリ秒の精度のみであるため、java.util.Date.getTime() などの関数は現在の時刻の値になります。

これはこれまでうまく機能していましたが、最近 1860 年代のデータを取得したため、次のコードは、値が 1901 未満の場合 (ギブ オア テイク) には機能しなくなりました。

to_timestamp('1-JAN-1970 00:00:00', 'dd-mon-yyyy hh24:mi:ss') + numtodsinterval(int_to_convert/(1000),'SECOND' );

-2177452800000 などのミリ秒単位の値でこれを試みると、2038 年のタイムスタンプで日付を返すなど、いくつかの問題が発生します。この問題を回避する方法はありますか? ドキュメントとタイムスタンプを調べたすべてのドキュメントは、-4000 (BC) までさかのぼって年を処理できるはずなので、numtodsinterval に問題があると思われます。

アイデアの提案は大歓迎です。

4

3 に答える 3

1

このようなものはどうですか:

select to_timestamp('1-JAN-1970 00:00:00', 'dd-mon-yyyy hh24:mi:ss') +
         numtodsinterval(val /(1000*60*60*24),'DAY' ) +
         numtodsinterval(
           ((val /(1000*60*60*24)) - (trunc(val /(1000*60*60*24))) ) * 60*60*24,'SECOND')
from (select -2177452812340 val from dual);

DAYコンポーネントを分離し、日全体を追加してから、余りを取り、より高い精度で追加します

于 2010-05-19T00:32:49.190 に答える
0

select to_date('01-JAN-1970','DD-MON-YYYY') + ( -1111111111 / (60 * 60 * 24*1000) ) from dual; Javaミリ秒を日付に変換するために私が使用するものです。

于 2010-05-18T22:40:37.960 に答える