我遇到过一个问题,让我很好奇程序员是否在演出,或者在性能方面是否有优点。我不知道为什么时间是01:59而不是00:00,这实际上会删除一些实际上想要包含的结果。
这是查询的where子句
WHERE REPORTDATE BETWEEN TRUNC(SYSDATE - 21) + 01 / 24 + 59 / (24 * 60) + 59 / (24 * 60 * 60)
AND TRUNC(SYSDATE) + 23 / 24 + 59 / (24 * 60) + 59 / (24 * 60 * 60)
如果我的数学是正确的,则与
相同WHERE REPORTDATE BETWEEN to_date('13/04/2017 01:59','dd/mm/yyyy hh24:mi')
AND to_date('04/05/2017 23:59','dd/mm/yyyy hh24:mi')
第一个计算的where子句在第二个中是否有任何好处?
答案 0 :(得分:4)
您可以使用区间文字来摆脱所有算术并简化查询:
WHERE REPORTDATE BETWEEN TRUNC( SYSDATE ) - INTERVAL '20 22:00:01' DAY TO SECOND
AND TRUNC( SYSDATE ) + INTERVAL '00 23:59:59' DAY TO SECOND
或
WHERE REPORTDATE BETWEEN TRUNC( SYSDATE ) - INTERVAL '21' DAY
+ INTERVAL '01:59:59' HOUR TO SECOND
AND TRUNC( SYSDATE ) + INTERVAL '00 23:59:59' DAY TO SECOND
或
WHERE REPORTDATE >= TRUNC( SYSDATE ) - INTERVAL '20 22:00:01' DAY TO SECOND
AND REPORTDATE < TRUNC( SYSDATE ) + INTERVAL '1' DAY
答案 1 :(得分:2)
评论太长了。基于查询中常量计算的不同方法,很难想象性能差异。
我会用这样的东西写这个:
WHERE REPORTDATE >= CAST(TIMESTAMP '2017-04-13 02:00:00' as DATE) and
REPORTDATE < DATE '2017-05-05'
如果要包含日期/时间常量,请使用支持标准格式的内置机制。
或根据当前日期提供更大的灵活性:
WHERE REPORTDATE >= TRUNC(sysdate) - 21 + 2 / 24 AND
REPORTDATE < TRUNC(sysdate) + 1
(或者,如果真的是1:59 ......那么TRUNC(sysdate) - 21 + (1 * 60 + 59) / (24 * 60)
。)