sql中的日期时间过滤器

时间:2018-04-30 10:38:22

标签: sql oracle datetime

我有一个报告要从sql查询每小时生成一次。 这里的要求是从昨天晚上8点到晚上生成数据 今天中午12点。我使用以下查询但没有获得正确的数据:

select * from roster_report where job_start > TRUNC(SYSDATE-1) + 20/24 ;

假设今天的日期是4月29日,则于4月29日晚11点15分生成的报告正确显示4月29日晚上8点到晚上11点15分的数据。 上午00:00之后数据变得不正确,它取自4月29日本身的数据,而不是4月30日。

每小时后将使用该查询生成报告。 我在oracle sql developer中运行它。

3 个答案:

答案 0 :(得分:0)

前一天下午8点

SELECT to_char(trunc(SYSDATE -1) + 20/24,'mm/dd/yyyy hh24:mi:ss AM') FROM dual;

今天下午12点

SELECT to_char(trunc(SYSDATE) + 12/24,'mm/dd/yyyy hh24:mi:ss AM') FROM dual;

示例查询

WITH DATA AS
( SELECT 'text' col, SYSDATE create_date FROM dual
  )
select *
from tw_logtable
where tw_logtable.created_datetime
BETWEEN (TRUNC(sysdate -1) + 20/24) AND (TRUNC(sysdate) + 12/24)

答案 1 :(得分:0)

尝试

WHERE 
    job_start >= ( TRUNC(SYSDATE-1) + INTERVAL '20' HOUR ) 
AND job_start <= ( TRUNC(SYSDATE)   + INTERVAL '12' HOUR  )

如果符合您的要求,您可以使用><。如果你想要的只是包含范围,也可以使用BETWEEN来简化。

答案 2 :(得分:0)

这里有两种方式:

SELECT * 
  FROM ROSTER_REPORT 
 WHERE JOB_START BETWEEN (TRUNC(SYSDATE - 1) + 20/24) 
                     AND TRUNC(SYSDATE) + 12/24 ;

SELECT * 
  FROM ROSTER_REPORT 
 WHERE JOB_START BETWEEN TO_DATE(TO_CHAR(SYSDATE-1,'DD/MM/RRRR')||' 20:00','DD/MM/RRRR HH24:MI') 
                     AND TO_DATE(TO_CHAR(SYSDATE  ,'DD/MM/RRRR')||' 12:00','DD/MM/RRRR HH24:MI');