1

我试图理解有人错误地在计算日期时实现以下要求的代码:

派生的 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
4

2 回答 2

2

鉴于这种:

select DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@FEED_DT),0))

让我们一块一块来...

DATEDIFF(m,0,@FEED_DT)

...计算从日期值零(评估为 1-1-1900)到日期时间字段 @FEED_DT 中开始的日期值所经过的整数月数。假设这个值为 @ElapsedMonthsSinceZero 并将这个变量替换为原始的嵌套函数,给出:

选择 DATEADD(s,-1,DATEADD(mm, @ElapsedMonthsSinceZero,0))

现在让我们评估这部分:

DATEADD(mm, @ElapsedMonthsSinceZero,0)

这会将相同的月数添加到日期“零”,即 1-1-1900,这会将您带到日期 @FEED_DT 的月份的第一天。本质上,到目前为止,我们所做的是计算从日期 0 过去的月数,截断从第 1 天到该月的任何一天。这给了我们@FirstDayOfFEED_DT。将其替换为函数会给我们...

select DATEADD(s,-1,@FirstDayOfFEED_DT)

现在我们有了日期 @FEED_DT 的月份的第一天,减去 1 就得到了上个月的最后一天。

我想我只是被传递值 0 而不是日期的差异所困扰。

于 2013-06-04T17:26:18.297 回答
1

假设您在新列中添加了几天,并且您有一个参数 @date 的存储过程,并且您希望将当前日期添加到该参数并以天为单位获得结果。

 DateAdd(days,@date,Getdate())
于 2014-10-06T16:40:51.803 回答