【发布时间】:2015-06-30 10:47:53
【问题描述】:
今晚时钟将增加闰秒,当天最后一小时的最后一分钟将有 61 秒。
2015-06-30 23:59:60
但是,Oracle 最多只支持一分钟 60 秒:
TO_DATE( '2015-06-30 23:59:60', 'YYYY-MM-DD HH24:MI:SS' )
错误:
ORA-01852: seconds must be between 0 and 59
和
SELECT TO_DATE( '2015-06-30 23:59:59', 'YYYY-MM-DD HH24:MI:SS' ) + INTERVAL '1' SECOND AS Incr_Second_Before,
TO_DATE( '2015-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS' ) - INTERVAL '1' SECOND AS Decr_Second_After
FROM DUAL
给出输出:
| INCR_SECOND_BEFORE | DECR_SECOND_AFTER |
|------------------------|------------------------|
| July, 01 2015 00:00:00 | June, 30 2015 23:59:59 |
有没有办法在 Oracle 中处理闰秒?
【问题讨论】:
-
您到底想处理什么?在第 61 秒内不能存在日期/时间戳;那么,如果操作系统时钟允许,您是否会问 sysdate/systimestamp 会显示什么?或者您是否正在获取第 61 秒的外部数据并想要解释/存储它?
-
如果我从
2015-06-30 23:59:60的外部源获取数据,它将出错并且无法存储。如果我这样做SELECT EXTRACT( SECOND FROM TIMESTAMP '2015-07-01 00:00:00.000' - TIMESTAMP '2015-06-30 23:59:59.000' ) FROM DUAL,答案应该是2,但Oracle 会返回1。我认为没有什么可以做的,但如果有什么地方可以用闰秒列表更新,那么 Oracle 会考虑到这一点,那么知道它会很有用。 -
OK,接着看MOS note 2019397.2;和 730795.1。虽然看起来什么都做不了。除了像用
:59替换:60这样的黑客我想...... -
@MT0 实际上,这仅在时间等于 UTC 的时区是正确的。闰秒同时添加到所有时区。因此,事实上,Oracle 的错误消息在这种特定情况下在世界大部分地区确实是正确的,因为没有选择时区。然而,在所有时区,6 月 30 日和 7 月 1 日的秒数总和应该是 172801 而不是 172800。
-
如果您真的关心闰秒,那么最好将时间存储为Julian Date 值。
标签: oracle