2013年12月31日 星期二

[SQL] 日期區間執行時間

在案子當中,
客戶的某個需求就是動態前六個月的資料,
但前六個月不包含當月,
也就是要減一個月在往前推六個月,
接著在撰寫SQL語法時,
我一開始的寫法如下:

substring(CONVERT(char(8),DATEADD(month, 0, CONVERT(datetime, CAST(V_Sales_Invoice_Body.IssuedDate AS varchar(8)))) ,112),1,6)
 >= substring(CONVERT(char(8),DATEADD(month, -6, GETDATE()),112 ),1,6)
 AND
substring(CONVERT(char(8),DATEADD(month, 0, CONVERT(datetime, CAST(V_Sales_Invoice_Body.IssuedDate AS varchar(8)))) ,112),1,6)
 <= substring(CONVERT(char(8),DATEADD(month, -1, GETDATE()),112 ),1,6)

因該日期欄位原本為numeric,
所以必須先轉成文字,再轉成日期,
看似做了很多轉換並用AND串成兩個條件,
但執行時間卻比以下語法還要快。

CONVERT(datetime, CAST(ProcessMonth * 100 + 1 AS varchar(8)),112)
BETWEEN DATEADD(month, - 7, GETDATE()) AND DATEADD(month, - 1,GETDATE())

此語法是利用另一個欄位ProcessMonth (ex. 201308)做運算再做轉換,
並用Between 串連。

沒有留言:

張貼留言