1

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

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

4

2 回答 2

2

将时间的分数向上取整会导致 sysdate 平均快半秒。

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

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

于 2012-05-25T20:54:18.070 回答
1

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

我强烈怀疑 Oracle 内核只是调用C 时间函数C gettimeofday 函数SYSDATE,所以无论库实现是什么,你都会得到。SYSTIMESTAMP

于 2012-05-25T19:02:05.537 回答