1

Oracle DB は日付関数でミリ秒をどのように丸めますか?

たとえばsysdate、正確に「05/25/2012 01:15:25.900」で実行された場合、日付は「05/25/2012 01:15:26」(切り上げ) または「05/25/2012」として保存されます。 01:15:25" (切り捨て)?

0.5 ミリ秒を超えるものはすべて切り上げ、0.5 ミリ秒未満のものは切り捨てますか?

ここに私がまとめた簡単なテストがあります:

SELECT to_char(systimestamp, 'dd-mm-yyyy hh:mi:ss:ff') as sys_time_stamp,
to_char(
     TO_DATE (
         TO_CHAR (SYSTIMESTAMP, 'YYYY-MON-DD HH24:MI:SS'),
         'YYYY-MON-DD HH24:MI:SS'), 
     'dd-mm-yyy hh:mi:ss') as sys_date
FROM DUAL;

実行 1
sys_time_stamp: 25-05-2012 12:37:32:798000
sys_date: 25-05-012 12:37:32

実行 2
sys_time_stamp: 25-05-2012 12:43:41:322000
sys_date: 25-05-012 12:43:41

これは、少なくとも asystimestampを aに変換するときにdate、ミリ秒が削除されることを示しています。しかし、sysdate実際に生成されたとき、ミリ秒は実際に単にドロップされているのでしょうか?

4

2 に答える 2

2

時間の端数を切り上げると、sysdate は平均で 0.5 秒速くなります。

翌日の 23:59:59.500 に切り替わります。

これは明らかにばかげているので、丸めではなく切り捨てを使用します。

于 2012-05-25T20:54:18.070 に答える
1

OracleDATEは秒単位の日付のみを格納SYSDATEし、基礎となるオペレーティング システムのクロックに依存しているため、結果はオペレーティング システムに依存すると予想されます。オラクルはオペレーティングシステムに「秒までの日付はSYSDATE何ですか」と「あなたが持っている最も精度の高い日付は何ですか」と尋ねているだけですSYSTIMESTAMP。その呼び出しは本質的にオペレーティング システムに依存し、動作はドキュメントで特に指定されていないため、オペレーティング システムが異なれば実装が異なるか、少なくとも可能性があると予想されます (技術的には、データベース カーネルが C ライブラリである可能性が高いです)。各オペレーティング システムに対してコンパイルされます)。

私は、Oracle カーネルが単に C のtime 関数C の gettimeofday 関数を呼び出しているのではないかと強く疑っています。SYSDATEそのため、ライブラリの実装がたまたまどのようなものであっても、その動作が得られます。SYSTIMESTAMP

于 2012-05-25T19:02:05.537 に答える