Oracle Date Rounding of Milliseconds

时间:2012-05-25 16:15:29

标签: sql oracle

Oracle DB如何在其日期函数中循环毫秒?

例如,如果sysdate正好在“05/25/2012 01:15:25.900”运行,则日期会存储为“05/25/2012 01:15:26”(向上舍入)或者作为“05/25/2012 01:15:25”(四舍五入)?

对于超过半毫秒的所有内容,它是否会进行四舍五入,而对于低于半毫秒的所有内容,它是否会缩小?

这是一个简单的测试:

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

这表明至少在将systimestamp转换为date时,毫秒才会丢弃。但是当实际生成sysdate时,实际上只有毫秒被删除了吗?

2 个答案:

答案 0 :(得分:2)

将时间分数舍入将导致sysdate平均快半秒。

它会在23:59:59.500翻到第二天。

这显然是愚蠢的,所以我将采用截断而不是舍入。

答案 1 :(得分:1)

由于Oracle DATE仅将日期存储到第二个,而SYSDATE依赖于底层操作系统的时钟,因此我希望结果取决于操作系统。 Oracle只是向操作系统询问SYSDATE的“第二天的日期是什么”以及SYSTIMESTAMP的“最精确的日期是什么”。由于该调用本质上是依赖于操作系统的,并且文档中没有另外指定行为,我希望不同的操作系统会或者至少可以有不同的实现(从技术上讲,更可能是数据库内核是C库的C库)在每个操作系统上编译。)

我强烈怀疑Oracle内核只是为SYSDATE调用C time function而为SYSTIMESTAMP调用C gettimeofday function所以无论库实现是什么行为都是行为你会得到的。