0

我正在尝试获取数据库中更新日期介于 systimestamp -15 分钟间隔到当前 systimestamp 之间的所有记录。

所以我要做的是:

and (CAST (update_date AS TIMESTAMP)  at time zone 'UTC') BETWEEN  (cast((systimestamp - interval '15' minute) at time zone 'UTC' as timestamp)) AND  (cast((systimestamp) at time zone 'UTC' as timestamp))

如果我将它们分开用于特定记录:

(CAST (update_date AS TIMESTAMP)  at time zone 'UTC') -> 26-APR-18 01.10.16.000000000 AM UTC
(cast((systimestamp - interval '15' minute) at time zone 'UTC' as timestamp)) -> 26-APR-18 12.57.04.136000000 AM
(cast((systimestamp) at time zone 'UTC' as timestamp)) -> 26-APR-18 01.12.04.136000000 AM

基本上第一个在另外两个之间,所以查询应该返回一条记录,但它没有。有什么帮助吗?

4

1 回答 1

1

SYSTIMESTAMP返回一个TIMESTAMP WITH TIME ZONE值。

假设update_date也是一个TIMESTAMP WITH TIME ZONE你根本不需要任何演员,只需运行

update_date BETWEEN SYSTIMESTAMP - interval '15' minute AND SYSTIMESTAMP

比较总是在 UTC 内部完成,请参阅Datetime and Interval Arithmetic

Oracle 数据库以 UTC 时间执行所有时间戳算术。对于 TIMESTAMP WITH LOCAL TIME ZONE 数据,Oracle 数据库将日期时间值从数据库时区转换为 UTC,并在执行算术后转换回数据库时区。对于 TIMESTAMP WITH TIME ZONE 数据,日期时间值始终采用 UTC,因此无需转换。

由于您DATEPST(nb,在这种情况下如何处理夏令时?)中有值,您将运行

FROM_TZ(CAST(update_date AS TIMESTAMP), 'PST') BETWEEN SYSTIMESTAMP - interval '15' minute AND SYSTIMESTAMP
于 2018-04-26T17:27:14.477 回答