2017-05-04 66 views
1

我遇到了一個查詢,它讓我很好奇程序員是否表演划船或者在性能方面是否有優點。我不知道爲什麼從時間是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

您是否試圖生成兩者的解釋平原以實際查看差異? –

回答

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 
2

這是太長的評論。根據查詢中計算常量的不同方式,很難想象會出現性能差異。

我會寫這個使用是這樣的:

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」。 –

相關問題