a和b之间的日期表现

时间:2017-05-04 16:16:37

标签: sql oracle

我遇到过一个问题,让我很好奇程序员是否在演出,或者在性能方面是否有优点。我不知道为什么时间是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子句在第二个中是否有任何好处?

2 个答案:

答案 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)。)