我有一个表格,其数据类型为“TIMESTAMP(6)WITH LOCAL TIME ZONE”
问题: 对于以下查询,我得到异常,表示时区不存在。
select * from table where update_time <= CURRENT_TIMESTAMP-3/24;
在弹簧时间变化的一小时窗口期间发生异常。我该如何克服这个问题?
答案 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:00
和03: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;