我正在尝试使用以下查询在过去一小时内更新所有记录。
select * from myTable where update_time > systimestamp - interval '1' hour;
我非常确定systimestamp占用了数据库的时区,而不是我机器的时区(我在CDT(-5),数据库是UTC)。当我运行上述查询时,它会在过去6小时内给出结果。更有趣的是,我使用以下结果运行此查询:
select systimestamp, update_time from myTable where update_time > systimestamp - interval '1' hour order by update_time asc;
SYSTIMESTAMP UPDATE_TIME
-------------------------------------- -------------------------------
20-AUG-14 05.27.34.534438000 PM +00:00 20-AUG-14 11.27.53.882180000 AM
20-AUG-14 05.27.34.534438000 PM +00:00 20-AUG-14 11.33.47.677019000 AM
20-AUG-14 05.27.34.534438000 PM +00:00 20-AUG-14 11.40.24.751760000 AM
20-AUG-14 05.27.34.534438000 PM +00:00 20-AUG-14 11.43.03.276697000 AM
20-AUG-14 05.27.34.534438000 PM +00:00 20-AUG-14 11.44.26.439896000 AM
20-AUG-14 05.27.34.534438000 PM +00:00 20-AUG-14 11.53.17.772865000 AM
20-AUG-14 05.27.34.534438000 PM +00:00 20-AUG-14 11.53.51.116485000 AM
...
为什么我会看到这些结果?
更新:这些查询有效:
select * from myTable where FROM_TZ(update_time, 'UTC') > systimestamp - interval '1' hour;
select * from myTable where update_time > CAST(systimestamp AS TIMESTAMP) - interval '1' hour;
我的问题,更具体地说,是如何让系统默认将时间戳值解释为UTC(甚至更好,在DB时区中解释它),而不是解释我机器当地时间的时间戳?