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
时,实际上只有毫秒被删除了吗?
答案 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所以无论库实现是什么行为都是行为你会得到的。