在案子當中,
客戶的某個需求就是動態前六個月的資料,
但前六個月不包含當月,
也就是要減一個月在往前推六個月,
接著在撰寫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 串連。
沒有留言:
張貼留言