我需要从表中获取systimestamp > LAST_UPDATE_TS + 5 minutes interval
的记录
请您协助查询吗?
ORACLE DB - 11G Version.
我尝试了以下操作,但未按预期工作。
SYSTIMESTAMP : 11-MAR-20 06.06.00.070695 AM -05:00
LAST_UPDATE_TS : 11-MAR-20 06.05.50.781167 AM
应用此条件后,systimestamp > LAST_UPDATE_TS + INTERVAL '5' MINUTE
,我希望没有数据应该返回,但是仍然会得到不满足条件的行。
您正在将SYSTIMESTAMP
数据类型的TIMESTAMP WITH TIME ZONE
与TIMESTAMP(6)
数据类型进行比较;这需要转换为时区。
如果使用:
SELECT SESSIONTIMEZONE FROM DUAL;
您可以看到您的会话使用的时区。
在db <>小提琴上,默认值为UTC(+00:00)并正在运行:
SELECT DUMMY AS query1
FROM DUAL
WHERE TIMESTAMP '2020-03-11 06:06:00.070695 -05:00' > TIMESTAMP '2020-03-11 06:05:50.781167' + INTERVAL '5' MINUTE
输出:
| QUERY1 || :----- || X |
因为2020-03-11 06:06:00.070695 -05:00
大于2020-03-11 06:10:50.781167 +00:00
。
如果您更改会话时区:
ALTER SESSION SET TIME_ZONE = '-05:00';
并再次运行相同的查询(使用了不同的列别名以防止缓存):
SELECT DUMMY AS query2
FROM DUAL
WHERE TIMESTAMP '2020-03-11 06:06:00.070695 -05:00' > TIMESTAMP '2020-03-11 06:05:50.781167' + INTERVAL '5' MINUTE
然后输出有零行:
| QUERY2 || :----- |
如果要在转换中手动设置时区,则可以使用FROM_TZ
功能:
SELECT DUMMY AS query3
FROM DUAL
WHERE TIMESTAMP '2020-03-11 06:06:00.070695 -05:00' > FROM_TZ( TIMESTAMP '2020-03-11 06:05:50.781167', '-05:00' ) + INTERVAL '5' MINUTE
再次输出零行:
| QUERY3 || :----- |
db <>小提琴here
[SYSTIMESTAMP
返回一个TIMESTAMP WITH TIME ZONE
值,将该值与TIMESTAMP
值进行比较。
实际上,Oracle正在这样做:
SYSTIMESTAMP > FROM_TZ(LAST_UPDATE_TS + INTERVAL '5' MINUTE, SESSIONTIMEZONE)
比较本身是在UTC时间执行的。
SYSTIMESTAMP
在数据库服务器操作系统的时区中返回。如果该时区等于您当前的SESSIONTIMEZONE
,则该条件将按预期工作。
将您的会话时区更改为数据库服务器操作系统的时区,或尝试以下一种:
LOCALTIMESTAMP > LAST_UPDATE_TS + INTERVAL '5' MINUTE
完全不使用时区。
检查了几个论坛和其他stackoverflow页面之后,我尝试了这个,它似乎可以正常工作了。
select *
from table
where cast(systimestamp as TIMESTAMP) > (lst_updt_ts + interval '3' minute);
是旧方法吗?
systimestamp -5 /(60 * 24)> LAST_UPDATE_TS