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')
是否有第一计算,其中在第二子句中的任何好处?
答
可以使用间隔文字摆脱所有的算术和简化查询:
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”。 –
我无法想象的方式,第一个查询可以更有效的,但我不知道甲骨文里面出来。是否可以询问编写原始查询的人?有很多开发人员在SQL方面不够强大,他们甚至都不知道SQL中的日期函数。 – RToyo
如果你在不同的日子运行它,第一个不必重写。 –
您是否试图生成两者的解释平原以实际查看差异? –