我試圖理解的代碼,有人錯誤地實現計算日期下列要求:使用T-SQL DATEADD和DATEDIFF函數
派生JE_ACCTNG_DT被設定爲等於前一個月的最後一天當前飼料創建和發送的當年。
例如,如果當前年份是2013年,JE_ACCTNG_DT將是基於所述季度進料被髮送以下內容:
- JE_ACCTNG_DT = 2013年3月31日爲第一季度飼料上發送4/1/2013
- JE_ACCTNG_DT = 2013年6月30日爲2013年7月1日上
- JE_ACCTNG_DT = 2013年9月30日爲2013年10月1日上
- JE_ACCTNG_DT = 12發送的第三季度進料送到第二季度飼料2013年1月1日發送的第四季度訂單/ 31/2013
我看到有人實現這樣的代碼,它似乎給在要求給出的例子正確的答案,如果日期時間的結果轉換爲日期數據類型(時間部分被丟棄)
DECLARE @FEED_DT datetime
SET @FEED_DT = '4/1/2013'
select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))
SET @FEED_DT = '7/1/2013'
select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))
--2013-06-30 23:59:59.000
SET @FEED_DT = '10/1/2013'
select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))
--2013-09-30 23:59:59.000
SET @FEED_DT = '1/1/2014'
select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))
--2013-09-30 23:59:59.000
什麼是困惑我的是,DATEDIFF函數接受以下參數:一個日期部分和兩個日期
DATEDIFF(日期部分,開始日期,結束日期)
如果你在上面看到,該代碼設定日期部分「 m「,但當期望日期時,第二個參數爲零。
DECLARE @FEED_DT datetime = '4/1/2013'
DECLARE @DateAddResult as int
SET @DateAddResult = DATEDIFF(m,0,@FEED_DT)
select @DateAddResult
--1359
select DATEADD(s,-1,DATEADD(mm, @DateAddResult,0))
--2013-03-31 23:59:59.000
代碼真的在幹什麼?我會期待一個錯誤。它是否強迫0值約會?
我在想,要求真的應該是計算上一季度的最後一天。這是我的方式。
SELECT dateadd(day, -1, DATEADD(quarter,DATEDIFF(quarter,'1900/01/01', GETDATE()), '1900/01/01')) as FirstDayOfQuarter
0 = 1900-01-01。 –
也請停止使用像mm和m這樣的懶惰速記。如果你是月份,輸入MONTH。 –
約定m和mm。你是兩個意見合併給我我的答案。謝謝。 – ChadD