a和b性能之间的日期

问题描述:

我遇到了一个查询,它让我很好奇程序员是否表演划船或者在性能方面是否有优点。我不知道为什么从时间是01:59而不是00:00,这实际上会删除一些实际上希望包含的结果。a和b性能之间的日期

这是查询

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子句,如果我的数学是正确的,是一样的

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

是否有第一计算,其中在第二子句中的任何好处?

+0

我无法想象的方式,第一个查询可以更有效的,但我不知道甲骨文里面出来。是否可以询问编写原始查询的人?有很多开发人员在SQL方面不够强大,他们甚至都不知道SQL中的日期函数。 – RToyo

+3

如果你在不同的日子运行它,第一个不必重写。 –

+1

您是否试图生成两者的解释平原以实际查看差异? –

可以使用间隔文字摆脱所有的算术和简化查询:

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 

这是太长的评论。根据查询中计算常量的不同方式,很难想象会出现性能差异。

我会写这个使用是这样的:

WHERE REPORTDATE >= CAST(TIMESTAMP '2017-04-13 02:00:00' as DATE) and 
     REPORTDATE < DATE '2017-05-05' 

如果你要包括日期/时间常数,使用支持标准格式的内置机制。

或有更多的灵活性基于当前日期:(。或者,如果1:59是真的打算再TRUNC(sysdate) - 21 + (1 * 60 + 59)/(24 * 60)。)

WHERE REPORTDATE >= TRUNC(sysdate) - 21 + 2/24 AND 
     REPORTDATE < TRUNC(sysdate) + 1 

+0

@AlexPoole。 。 。谢谢。我看到了“+ 23”,然后停止阅读,因为我错过了“/ 24”。 –