执行此查询后
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之后显示。我在这里做错了什么?
答案 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是一种很好的做法。