如何处理Oracle中的闰秒

MT0*_*MT0 10 oracle

今晚将有一个闰秒添加到时钟,在一天的最后一小时的最后一分钟将有61秒.

2015-06-30 23:59:60
Run Code Online (Sandbox Code Playgroud)

但是,Oracle一分钟只支持60秒:

TO_DATE( '2015-06-30 23:59:60', 'YYYY-MM-DD HH24:MI:SS' )    
Run Code Online (Sandbox Code Playgroud)

错误:

ORA-01852: seconds must be between 0 and 59
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

给出输出:

|     INCR_SECOND_BEFORE |      DECR_SECOND_AFTER |
|------------------------|------------------------|
| July, 01 2015 00:00:00 | June, 30 2015 23:59:59 |
Run Code Online (Sandbox Code Playgroud)

有没有办法在Oracle中处理闰秒?

Ann*_*awn 2

来自 MOS-

将闰秒插入时间戳列失败,出现 ORA-01852(文档 ID 1553906.1)

适用于:

Oracle 数据库 - 企业版 - 版本 8.1.7.4 及更高版本

Oracle 数据库 - 标准版 - 版本 8.1.7.4 及更高版本

本文档中的信息适用于任何平台。

症状:

尝试将闰秒插入时间戳列失败并显示:ORA-01852:秒必须介于 0 和 59 之间

原因

无法在日期或时间戳数据类型中存储 >59 秒的值

解决方案

要解决此问题,可以将闰秒记录存储在 varchar2 数据类型中,例如

SQL> create table test (val number, t varchar2(30));

Table created.

SQL> insert into test values(123, '2012-06-30T23:59:60.000000Z');

1 row created.

不是最好的解决方案,而是唯一的解决方案。

  • 这是一个糟糕的解决方案,并且与 Oracle 中处理日期的所有最佳实践相矛盾。如果这是一个关键问题,那么我宁愿找到一种使用修改后的时间戳算法来正确表达一个或多个闰秒之间秒数差异的方法,令我惊讶的是 Oracle 公司没有这样做。 (4认同)
  • 虽然这是存储闰秒的“解决方案”(我同意它违背了所有最佳实践);它没有解决跨越闰秒的日期算术的额外问题 - 然后您必须创建自己的函数来处理算术,并有一个闰秒查找表来对计算进行调整。看起来 Oracle 建议您必须从头开始重新实现日期/时间处理才能解决此问题。 (3认同)