You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中DATEADD计算日期与表内日期匹配失败如何解决

核心问题原因

你的查询逻辑存在根本性错误,和DATEADD函数本身无关:
你在CASE判断中使用的[date] = DATEADD(wk,-52,[date]),等号左右两侧引用的是同一行、同一个分组的date字段,相当于判断某个日期减去52周后是否等于自身,这个条件永远不成立,因此所有case分支都返回0,聚合后py_rev自然为0。
你硬编码日期可以返回结果,是因为此时条件变成了当前行date等于你输入的固定值,符合条件的行就会返回对应营收,和原逻辑完全不同。

正确实现方案

要获取每个日期对应的上年同期营收,优先用自关联的方式实现,兼容性最好:

SELECT 
    t1.cur_date,
    t1.py_date,
    ISNULL(SUM(t2.sum_rev), 0) AS py_rev
FROM (
    -- 先计算每个当前日期对应的上年同期日期
    SELECT 
        [date] AS cur_date,
        DATEADD(wk, -52, [date]) AS py_date
    FROM summary
    GROUP BY [date]
) t1
-- 关联原表匹配同期的营收数据
LEFT JOIN summary t2 
    ON CAST(t2.[date] AS DATE) = CAST(t1.py_date AS DATE)
GROUP BY t1.cur_date, t1.py_date

如果你的SQL Server版本支持窗口函数、且业务日期是连续无缺失的,可以用LAG函数简化写法,执行效率更高:

SELECT 
    [date] AS cur_date,
    DATEADD(wk, -52, [date]) AS py_date,
    ISNULL(LAG(sum_rev, 364) OVER (ORDER BY [date]), 0) AS py_rev -- 52周固定等于364天
FROM summary
GROUP BY [date], sum_rev

注:如果你的date字段包含时分秒,关联/判断前统一用CAST([date] AS DATE)做类型转换,避免时间部分不匹配导致关联失败;如果要统计自然年同期而非52周同期,把DATEADD(wk, -52, [date])改成DATEADD(year, -1, [date])即可。

sample data set

内容的提问来源于stack exchange,提问作者Michael Summons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 20:24:05