0

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

问题:对于下面的查询,我得到异常,说时区不存在。

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

在春季时间变化的一小时窗口期间发生异常。我该如何克服呢?

4

1 回答 1

1

我无法在我的环境中重现,但我认为该错误是由将DATE数据类型转换为 invalid引起的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:00和之间转发03:00

由于运算符的右侧<=是日期(添加时间戳和数字会产生日期)并且您将其与 a 进行比较TIMESTAMP WITH LOCAL TIME ZONE,因此它将被转换为列的数据类型。

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

你能试一下吗:

select * from table where update_time <= CURRENT_TIMESTAMP - INTERVAL '3' HOUR;
于 2014-03-05T13:54:42.973 回答