想要在SYSDATE之间使用时间范围

时间:2013-07-29 16:44:35

标签: sql oracle

这会给我的时间范围从昨天晚上10点(2200点)到今天早上8点(0800点)?

WHERE MOPACTIVITY.MOPSTART between (trunc(sysdate-1) + 22/24) and (trunc(sysdate) + 08/24)

1 个答案:

答案 0 :(得分:3)

查看为您提供简单查询的范围非常简单:

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';

select trunc(sysdate-1) + 22/24, trunc(sysdate) + 08/24 from dual;

TRUNC(SYSDATE-1)+22 TRUNC(SYSDATE)+08/2
------------------- -------------------
2013-07-28 22:00:00 2013-07-29 08:00:00

但有两点意见。 (1)尽管使用分数作为时间偏移是好的,但使用interval literals可能会更清楚:

select trunc(sysdate-1) + interval '22' hour,
    trunc(sysdate) + interval '8' hour
from dual;

TRUNC(SYSDATE-1)+IN TRUNC(SYSDATE)+INTE
------------------- -------------------
2013-07-28 22:00:00 2013-07-29 08:00:00

而且(2)between是包容性的,所以如果你把这一天分成'轮班',那么冒险将数据记录在08:00计算两次,这可能不是你的想。为避免重叠,您只需将其更改为:

WHERE MOPACTIVITY.MOPSTART >= trunc(sysdate-1) + interval '22' hour
AND MOPACTIVITY.MOPSTART < trunc(sysdate) + interval '8' hour