0

我需要从表中获取记录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,我预计不会返回任何数据,但我仍然得到不满足条件的行。

4

4 回答 4

1

SYSTIMESTAMP返回一个TIMESTAMP WITH TIME ZONE与值进行比较的TIMESTAMP值。

实际上甲骨文正在这样做:

SYSTIMESTAMP > FROM_TZ(LAST_UPDATE_TS + INTERVAL '5' MINUTE, SESSIONTIMEZONE)

比较本身是在 UTC 时间上执行的。

SYSTIMESTAMP以数据库服务器操作系统的时区返回。如果此时区等于您当前的时区,SESSIONTIMEZONE则条件按预期工作。

将会话时区更改为数据库服务器操作系统的时区,或尝试以下方法:

LOCALTIMESTAMP > LAST_UPDATE_TS + INTERVAL '5' MINUTE

它根本不使用时区。

于 2020-03-11T12:19:39.450 回答
1

您正在将SYSTIMESTAMP哪种TIMESTAMP WITH TIME ZONE数据类型与TIMESTAMP(6)数据类型进行比较;这需要转换为时区。

如果您使用:

SELECT SESSIONTIMEZONE FROM DUAL;

您可以看到您的会话使用的时区。

在 db<>fiddle 上,默认值为 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

输出:

| 查询1 |
| :----- |
| 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

然后输出有零行:

| 查询2 |
| :----- |

如果要在转换中手动设置时区,则可以使用以下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

再次输出零行:

| 查询3 |
| :----- |

db<>在这里摆弄

于 2020-03-11T12:17:46.240 回答
0

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

select *
from table
where cast(systimestamp as TIMESTAMP)  > (lst_updt_ts  + interval '3' minute);
于 2020-03-11T12:27:08.780 回答
0

用老办法做吗?

系统时间戳 -5/(60*24) > LAST_UPDATE_TS

于 2020-03-11T12:53:21.830 回答