WITH x ( dy ,mth ) AS ( SELECT dy ,month(dy) FROM ( SELECT dateadd(mm, 1, (getdate() - datepart(dy, getdate())) + 1) dy ) tmp1 UNION ALL SELECT dateadd(dd, 1, dy) ,mth FROM x WHERE month(dateadd(dd, 1, dy)) = mth ) SELECT max(day(dy)) FROM x
利用 WITH 递归查询生成 2 月的每一天。
第一步先找出 2 月的第一天。
先找出当前年份的第一天:计算出当前日期是当前年份的第几天,用当前日期减去 该值,然后再加上 1 天。
select getdate()-datepart(dy,getdate())+1
既然有了当前年份的第一天,调用 DATEADD 函数加上 1 个月,就 能得到 2 月的第一天了。
select dateadd(mm,1,(getdate()-datepart(dy,getdate()))+1) dy
WITH 子句的递归特性,不断为内嵌视图 TMP1 返回的 DY 加上 1,直到日期对应的 月份不再是 2 月,