我想問3個關於下面的代碼的問題(請原諒冗長的代碼清單,我希望這些代碼能夠提供足夠的上下文)。存儲過程中的SQL Server日期計算
請注意,這裏的代碼取決於它執行的日期。出於這個原因,我的問題涉及到一個假設的情況有兩種不同的執行日期:
- 2014年3月1日
- 2014年1月1日
我的問題是在我上的這一些地區的理解是否正確的,即:
A。該SELECT DATEADD
表達式(第1行)將:
- 在2014年3月1日創建的日期時間
2014-02-31 23:59:59
乙。上線碼6-9將:
- 在2014年3月1日創建日期時間
2014-02-01 00:00:00
- 在2014年1月1日創建日期時間
2013-02-01 00:00:00
和
C。上線11-14的代碼將:
- 在2014年3月1日創建日期時間
2015-01-30 00:00:00
- 在2014年1月1日創建日期時間
2014-01-30 00:00:00
這是理解是否正確?
1. SET @ldpmth = (SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)))
2. SET @yr = (SELECT YEAR(@ldpmth))
3. SET @mth = 0
4. SET @dy = 0
5.
6. SET @fysdate = (SELECT CASE WHEN MONTH(@ldpmth) >= 2 THEN
7. DATEADD(MM, 1,CAST(CAST(@[email protected][email protected] AS NVARCHAR(50)) AS DATETIME))
8. ELSE DATEADD(MM, 1, CAST(CAST((@yr-1)[email protected][email protected] AS NVARCHAR(50))
9. AS DATETIME)) END)
10.
11. SET @fyedate = (SELECT CASE WHEN MONTH(@ldpmth) >= 2 THEN
12. DATEADD(YY, 1, CAST(CAST(@[email protected][email protected] AS NVARCHAR(50)) AS DATETIME)) + 30
13. ELSE DATEADD(YY, 1, CAST(CAST((@yr-1)[email protected][email protected] AS NVARCHAR(50))
14. AS DATETIME)) + 30 END)
(謝謝所有誰迄今回答了。其實,這是在我工作的地方,幾年前開發的(但沒有記錄)代碼,我一直負責其轉換爲一個可行的形式客戶端使用Crystal Reports)
爲什麼不能用'2014-03-01'代替'GETDATE()'並自己測試它們? – Kermit
對於問題A,你做錯了。你可能試圖捕獲上個月發生的所有事情,並且你正在努力計算一個包容性的端點(目前排除了發生在那天的最後一分鐘x毫秒內的任何事情) - 計算起來要容易得多當你處理連續時,一個*獨佔*上限。 –