SQL日历is_mtd_all字段计算异常:2020-01-01未正确返回1如何解决
代码缺陷原因
你现有的逻辑多余使用了dayofyear(年度第几天)做判断,完全没有必要,还引入了闰年的兼容问题:
你已经通过datepart(month,[Date])=datepart(month,getdate())限定了待判断日期和当前日期属于同一个月份,直接比较两个日期的「日」部分就可以满足需求,用dayofyear反而会因为平闰年2月天数的差异,导致同月同日的两个日期dayofyear取值不一致。
举个例子:
- 平年3月1日的
dayofyear是第59天 - 闰年(比如2020年)3月1日的
dayofyear是第60天
如果当前日期是平年的3月1日,判断2020年3月1日时会出现60 <= 59不成立的情况,本该返回1的结果就会返回0。你遇到的2020年1月1日异常,本质上也是错误使用dayofyear做同月日期对比导致的边界问题。
修复方案
直接把判断条件里的dayofyear换成day即可:
[is_mtd_all] AS (case when datepart(day,[Date])<=datepart(day,getdate()) AND datepart(month,[Date])=datepart(month,getdate()) then (1) else (0) end)
内容的提问来源于stack exchange,提问作者crazybob
相关产品推荐
相关产品推荐

