Oracle时间戳和时间间隔

问题描述 投票:0回答:4

我需要从表中获取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,我希望没有数据应该返回,但是仍然会得到不满足条件的行。

oracle date timestamp intervals systimestamp
4个回答
1
投票

您正在将SYSTIMESTAMP数据类型的TIMESTAMP WITH TIME ZONETIMESTAMP(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


1
投票

[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

完全不使用时区。


0
投票

检查了几个论坛和其他stackoverflow页面之后,我尝试了这个,它似乎可以正常工作了。

select *
from table
where cast(systimestamp as TIMESTAMP)  > (lst_updt_ts  + interval '3' minute);

0
投票

是旧方法吗?

systimestamp -5 /(60 * 24)> LAST_UPDATE_TS

© www.soinside.com 2019 - 2024. All rights reserved.