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

使用WHERE日期过滤与SQL计算指标结果不一致问题求助

问题排查与修正

差异原因分析

第一个CASE WHEN的逻辑存在致命错误:它错误地要求所有同年内、月份≤当前月的记录,日期必须小于当前日。这会直接漏掉当月之前月份中,日期大于当前日的所有记录(比如今日是11月14日,10月15日至10月31日的所有预订记录都会被排除),这正是两个查询结果差异的核心原因。

对比第二个查询的逻辑:直接筛选booking_date >= 当年1月1日且booking_date < 今日0点,这是完全正确的年初至昨日的统计范围。

修正后的CASE WHEN语句

调整条件逻辑,仅在月份等于当前月时才限制日期小于当前日,月份小于当前月的记录直接纳入统计:

SELECT COUNT(CASE WHEN 
                DATEPART(Year, booking_date) = DATEPART(Year, GETDATE()) AND 
                (DATEPART(Month, booking_date) < DATEPART(Month, GETDATE()) OR 
                 (DATEPART(Month, booking_date) = DATEPART(Month, GETDATE()) AND 
                  DATEPART(Day, booking_date) < DATEPART(Day, GETDATE()))) THEN 
                booking_date END) as "YearToDate" 
FROM booking_table

更高效的替代写法

推荐直接使用日期范围进行筛选,既能避免拆分日期字段的逻辑错误,又能利用表上的日期索引提升查询效率,逻辑和第二个校验查询完全对齐:

SELECT COUNT(booking_date) as "YearToDate"
FROM booking_table
WHERE booking_date >= DATEFROMPARTS(DATEPART(Year, GETDATE()), 1, 1)
  AND booking_date < CAST(GETDATE() AS DATE)
  • DATEFROMPARTS(...) 自动生成当年1月1日的起始日期
  • CAST(GETDATE() AS DATE) 转换为当日0点的日期,booking_date < 此值即表示所有截至昨日的记录

内容的提问来源于stack exchange,提问作者Azifah Devy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:15:31