我有一个表,其列的数据类型为“TIMESTAMP(6) WITH LOCAL TIME ZONE”
问题:对于下面的查询,我得到异常,说时区不存在。
select * from table where update_time <= CURRENT_TIMESTAMP-3/24;
在春季时间变化的一小时窗口期间发生异常。我该如何克服呢?
我有一个表,其列的数据类型为“TIMESTAMP(6) WITH LOCAL TIME ZONE”
问题:对于下面的查询,我得到异常,说时区不存在。
select * from table where update_time <= CURRENT_TIMESTAMP-3/24;
在春季时间变化的一小时窗口期间发生异常。我该如何克服呢?
我无法在我的环境中重现,但我认为该错误是由将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;