Sql 无法提取正确的时间范围

Sql 无法提取正确的时间范围,sql,oracle,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' 和TRUNC(ITD.TRAN_DATE)>=“2018年4月2日” 和TO_CHAR(ITD.TRAN_DA

执行此查询后

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'
和TRUNC(ITD.TRAN_DATE)>=“2018年4月2日”
和TO_CHAR(ITD.TRAN_DATE,'HH24MI')>='0600'

还有TRUNC(ITD.TRAN_DATE)不确定你想要什么。也许是这样:

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')

在您的问题中,假设日期格式为DD-MON-YY。就目前的环境而言,情况可能是这样,但可能并非总是如此。因此,使用to char或to date on
date
值或字符串是一种很好的做法。

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

AND TO_CHAR(TRUNC(ITD.TRAN_DATE+1),'HH24MI')<='0030'
和TO_CHAR(TRUNC(ITD.TRAN_日期+1),'HH24MI')=日期'2018-04-02'+(6/24)

和itd.tran_date当您与数字(包括日期)数据进行词汇(字符串)比较时,几乎总是会失败。此外,当您
trunc
datetime时,时间部分将丢失。所以最后一个条件总是返回0000,所有条目的比较都成功。我这样做是为了在excel中用作参数。所以我无法添加额外的语句来只在12:30之前收集数据?
where itd.tran_date >= date '2018-04-02' + (6/24)
and   itd.tran_date <= date '2018-04-03' + (1/48)