匹配日期与计算的 DATEADD 日期

问题描述

我正在尝试创建一个包含当前日期、上一年日期和总收入的附加列的表,如下所示:

cur_date | py_date | py_rev

我正在尝试比较跨年任何每日时段的收入。假设所有日期和收入值都包含在同一个 sql Server 表中。

我尝试使用使用 [date] = DATEADD(wk,-52,[date]) 作为条件的 case 语句来返回适当的总数。全行代码如下:

select 
[date] as cur_date,DATEADD(wk,[date]) py_date,SUM(case when [date] = DATEADD(wk,[date]) then sum_rev else 0 end) as py_rev
from summary
group by [date] 

运行此代码时,py_date 符合预期,但 py_rev 返回 0,就好像没有匹配项一样。最令人困惑的是,如果我硬编码一个随机日期来代替 DATEADD 部分,则返回总数。我也试过 CAST 将日期和 DATEADD 部分格式化为日期,但没有运气。

是否有关于 DATEADD 的某些内容与我遗漏的其他日期列不匹配?

sample data set

解决方法

如果您想要前几年的收入,那么 select [date] as cur_date,dateadd(week,-52,[date]) as py_date,lag(sum_rev,52 * 7) over (order by date) as py_rev from summary; 是一种方法。假设“上一年”是指 52 周前,并且您有所有日期的记录,则此方法有效:

LEFT JOIN

如果您没有所有日期的记录,则需要另一种方法。您可以使用 select s.date,s.[date]),sprev.sum_rev as py_rev from summary s left join summary sprev on sprev.date = dateadd(week,s.[date]); :

and