无法拉出正确的时间范围

时间:2018-04-03 16:43:44

标签: sql oracle

执行此查询后

AND TRUNC(ITD.TRAN_DATE)>= '02-APR-18'
AND TO_CHAR(ITD.TRAN_DATE,'HH24MI')>='0600'
AND TRUNC(ITD.TRAN_DATE)<= '03-APR-18'
AND TO_CHAR(TRUNC(ITD.TRAN_DATE+1),'HH24MI')<='0030'

4月2日早上6点之后的所有内容都会显示,但也会在第二天上午12:30之后显示。我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

当我们截断日期时,我们删除了时间元素。因此,'HH24:MI'的掩码将返回'00:00',这意味着无论ITD的实际时间成分如何,始终为真

AND TO_CHAR(TRUNC(ITD.TRAN_DATE+1),'HH24MI')<='0030'

你应该做的事情可能更简单,比如

where itd.tran_date >= date '2018-04-02' + (6/24)
and   itd.tran_date <= date '2018-04-03' + (1/48)

这是a SQL Fiddle demo将您的WHERE子句与我的建议进行比较。

答案 1 :(得分:0)

不确定你想要什么。也许这个:

and to_char(itd.tran_date, 'YYYYMMDD-HH24MISS')
    between '20180402-0600'
        and '20180403-0030'

如果是这样,并且如果表有很多行且tran_date是一个索引列,那么这可能要快得多:

and itd.tran_date
    between to_date('20180402-0600','YYYYMMDD-HH24MI')
        and to_date('20180403-0030','YYYYMMDD-HH24MI')

在您的问题中,您假设date_format为DD-MON-YY。对于今天的环境,现在可能就是这种情况,但可能并非如此。因此,在DATE值或字符串上使用to_char或to_date是一种很好的做法。