【问题标题】:Matching date with calculated DATEADD date将日期与计算的 DATEADD 日期匹配
【发布时间】:2021-08-29 10:36:54
【问题描述】:

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

当前日期 | py_date | py_rev

我正在尝试比较多年来任何一天的收入。假设所有日期和收入值都包含在同一个 SQL Server 表中。

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

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

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

DATEADD 是否有某些内容与我缺少的其他日期列不匹配?

【问题讨论】:

  • 请张贴一小部分数据。
  • 当然 date 不能等于 date 减去 52 周。所以你最终会求和零。要获得有关您实际想做的edit 问题的帮助并提供minimal reproducible example,即所涉及的表或其他对象的CREATE 语句(粘贴文本,不要使用图像,不要链接到外部站点),INSERT 用于示例数据的语句(dito)以及表格文本格式的示例数据的期望结果。
  • 同时标记您正在使用的 DBMS。
  • 表中必须有日期/时间字段才能应用过滤器。编辑问题以显示实际数据。
  • 示例数据作为链接附加

标签: sql sql-server tsql dateadd


【解决方案1】:

如果您想要前几年的收入,那么lag() 是一种方法。假设“上一年”表示 52 周前并且您有所有日期的记录,则此方法有效:

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;

如果您没有所有日期的记录,则需要另一种方法。你可以使用LEFT JOIN:

select s.date, dateadd(week, -52, s.[date]),
       sprev.sum_rev as py_rev
from summary s left join
     summary sprev
     on sprev.date = dateadd(week, -52, s.[date]);

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 2023-03-31
    • 2020-01-24
    • 1970-01-01
    相关资源
    最近更新 更多