Sysdate与Timestamp进行比较

时间:2012-03-09 20:03:14

标签: sql oracle date-arithmetic

我正在检查取决于时间的产品更新 - 提醒产品在过去2小时内是否未更新,例如:

03:30 - 07:29我们希望只有产品x更新;
07:30 - 11:29我们希望产品x和y都能更新 11:30 - 15:30我们预计只有产品y才会更新

但我们需要对尚未更新昨天且仍未更新今天的产品保持敏感。因此,我的问题 - 在对产品y进行以下时间戳比较时,我怀疑日期没有考虑因素,因此未更新的产品可能会被忽略。

(...)
AND inv.timestamp      < sysdate        - (120 / 1440) --older than two hours
AND inv.timestamp      > TRUNC(sysdate) + (690/1440)   --after 11:30
AND inv.timestamp      < TRUNC(sysdate) + (930/1440)   --before 15:30
(...)

inv.timestamp是timestamp(6)类型的列。 trunc(sysdate)是否隐式包含当前的比较日期,还是只使用时间?

2 个答案:

答案 0 :(得分:2)

TRUNC(SYSDATE)返回当天的00:00:00。

SQL> select trunc(sysdate) from dual;

TRUNC(SYSDATE)
-------------------
2012-03-09 00:00:00

Documentation on TRUNC

答案 1 :(得分:0)

正如eaolson和Ben已经注意到的,SYSDATE包括日期和时间。使用TRUNC“删除”时间元素,即将其重置为当天的午夜。

您可能需要考虑使用Oracle提供的INTERVAL功能,以便更清楚地了解SQL的用途,例如。

SELECT to_char(trunc(sysdate) + interval '11' hour + interval '30' minute,'dd/mm/yyyy  hh24:mi:ss') sysdate_trunced_to_1130,
       to_char(trunc(current_timestamp) + interval '11' hour + interval '30' minute,'dd/mm/yyyy hh24:mi:ss') timestamp_trunced_to_1130
FROM dual; 

瞥了一眼代码,“(690/1440)”并没有立即建议早上11:30,但+间隔'11'小时+间隔'30'分钟希望好一点。