2017-04-12 109 views
0

我想修改下面的查詢以避免使用函數Timestamp。由於正在使用此功能,因此不使用索引。請讓我知道可以使用什麼替代品。這個查詢是針對DB2數據庫的。替代函數時間戳

SELECT *     
    FROM Capacity CPC   
WHERE TIMESTAMP(CPC.CPC_DATE,CPC_TIME) BETWEEN    
     CURRENT TIMESTAMP + :Input_number HOURS 
    AND             
     CURRENT TIMESTAMP + :Input_number HOURS 
+0

我覺得你最好的選擇將是與它的索引或函數索引創建計算'TIMESTAMP'列如果你的DB2版本支持它的話。 – mustaccio

+0

附註:請[不要使用'BETWEEN'作日期/時間類型](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil- have-in-common.aspx)(這篇文章談到了SQL Server,但底層問題實際上是平臺不可知的)。如果您分頁查詢,這裏主要關心的是獲得相同的結果。日期/時間類型是正數,連續範圍類型,應該總是用獨佔上限('<') –

回答

-1

這是因爲你的數據是不是在2NF幾乎絕望:CPC_DATECPC_TIME應單列CPC_DATETIME。如果您不需要該表單中的時間組件,則仍然可以從YYYY-MM-DD-00:00:00查詢到(YYYY-MM-DD plus one day minus one second),並使用索引保留。

+0

「幾乎無望」查詢?我想不是。 – 2017-04-13 15:05:12

0

你必須分別分解日期範圍和時間範圍。部分時間只需要在範圍內的同一日期部分,如果它檢查:

SELECT * 
FROM Capacity CPC 
WHERE 
CPC_DATE >= DATE(CURRENT TIMESTAMP - :Input_number HOUR) 
AND 
CPC_DATE <= DATE(CURRENT TIMESTAMP + :Input_number HOUR) 
AND 
CPC_TIME >= 
    CASE WHEN CPC_DATE = DATE(CURRENT TIMESTAMP - :Input_number HOUR) 
     THEN TIME(CURRENT TIMESTAMP - :Input_number HOUR) 
     ELSE '00:00:00' 
    END 
AND 
CPC_TIME <= 
    CASE WHEN CPC_DATE = DATE(CURRENT TIMESTAMP + :Input_number HOUR) 
     THEN TIME(CURRENT TIMESTAMP + :Input_number HOUR) 
     ELSE '24:00:00' 
    END 
+0

請勿在正連續範圍類型(​​如日期/時間)中使用'BETWEEN';如果此查詢是基於小時分頁的,則最終會在兩邊的最後一小時選擇一些內容。 –