首页 > 解决方案 > Oracle - 使用 sysdate 的错误结果

问题描述

我有以下查询。此查询不返回任何结果:

select snap_id from perfstat.stats$snapshot where snap_time = sysdate;

no rows selected

但是如果我格式化 snap_time 和 sysdate 我会收到结果:

select snap_id 
from perfstat.stats$snapshot 
where to_char(snap_time,'dd/mm/yyyy') = to_char(sysdate,'dd/mm/yyyy');

SNAP_ID
----------
         1
         2
         3

我的查询有问题吗?为什么我需要在这种情况下格式化日期?

obs:snap_time 列是日期类型。

标签: sqlstringoracledatetimewhere-clause

解决方案


查询的where子句不相同。

第一个查询尝试匹配snap_date当前日期和时间。这不太可能成功,除非在执行查询的同一秒创建快照。

第二个查询将日期部分snap_date与当前日期进行比较(不考虑时间部分)。

这:

where to_char(snap_time,'dd/mm/yyyy') = to_char(sysdate,'dd/mm/yyyy')

其实意思是:

where trunc(snap_time) = trunc(sysdate)

哪个可以(并且应该)优化为更清晰,更有效:

where snap_time  >= trunc(sysdate)

推荐阅读