我试图理解有人错误地在计算日期时实现以下要求的代码:
派生的 JE_ACCTNG_DT 设置为等于创建和发送提要时当年上个月的最后一天。
例如,如果当前年份是 2013 年,则 JE_ACCTNG_DT 将基于发送源的季度如下:
- JE_ACCTNG_DT = 2013 年 3 月 31 日,用于 2013 年 4 月 1 日发送的第一季度提要
- JE_ACCTNG_DT = 2013 年 6 月 30 日,用于 2013 年 7 月 1 日发送的第二季度提要
- JE_ACCTNG_DT = 2013 年 9 月 30 日,用于 2013 年 10 月 1 日发送的第三季度提要
- JE_ACCTNG_DT = 2013 年 12 月 31 日,用于 2014 年 1 月 1 日发送的第四季度提要
我看到有人实现了这样的代码,如果将日期时间结果转换为日期数据类型(删除时间部分),它似乎为要求中给出的示例给出了正确的答案
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