在where子句中的弹簧时间更改(DST)期间的异常

时间:2014-03-05 11:22:13

标签: oracle dst timestamp-with-timezone

我有一个表格,其数据类型为“TIMESTAMP(6)WITH LOCAL TIME ZONE”

问题: 对于以下查询,我得到异常,表示时区不存在。

select * from table where update_time <= CURRENT_TIMESTAMP-3/24;

在弹簧时间变化的一小时窗口期间发生异常。我该如何克服这个问题?

1 个答案:

答案 0 :(得分:1)

我无法在我的环境中重现,但我认为错误是由DATE数据类型转换为无效的TIMESTAMP WITH LOCAL TIME ZONE引起的。

例如,在Europe/Paris时区,时间戳2014-03-30 02:30:00无效:

SQL> SELECT to_timestamp_tz('2014-03-30 02:30 Europe/Paris',
  2                         'yyyy-mm-dd hh24:mi TZR')
  3    FROM dual;
SELECT to_timestamp_tz('2014-03-30 02:30 Europe/Paris',
                       *
ERROR at line 1:
ORA-01878: specified field not found in datetime or interval

由于时钟在02:0003:00之间转发,因此时间和日期不存在。

由于<=运算符的右侧是日期(adding a timestamp and a number produces a date),并且您将其与TIMESTAMP WITH LOCAL TIME ZONE进行比较,因此会将其转换为列的数据类型。

我认为使用区间算术将解决问题,因为这将转换为有效的时间戳。作为额外的好处,生成的代码将更容易阅读。

你可以尝试:

select * from table where update_time <= CURRENT_TIMESTAMP - INTERVAL '3' HOUR;