使用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
相关产品推荐
相关产品推荐

