SQL Server中获取每月5日日期的实现方法咨询
嘿,这个需求其实挺常见的,在SQL Server里有几种靠谱的方法能实现,我给你梳理几个实用的方案,你可以根据自己的场景选择:
方法一:用递归CTE生成每月5日日期
递归CTE是生成连续日期序列的常用方式,针对指定年份的12个月,我们可以从1月5日开始逐月递推,逻辑很直观:
DECLARE @TargetYear INT = 2024; -- 替换成你需要的目标年份 WITH MonthlyDates AS ( -- 初始化:生成目标年份的1月5日 SELECT CAST(CONCAT(@TargetYear, '-01-05') AS DATE) AS Month5Date UNION ALL -- 逐月递推,每次加1个月 SELECT DATEADD(MONTH, 1, Month5Date) FROM MonthlyDates -- 终止条件:确保下一个日期仍在目标年份内 WHERE DATEPART(YEAR, DATEADD(MONTH, 1, Month5Date)) = @TargetYear ) SELECT Month5Date FROM MonthlyDates OPTION (MAXRECURSION 12); -- 一年最多12个月,设置递归次数为12足够
这种方法不需要依赖额外的表,代码简洁易读,适合大多数场景。
方法二:用数字序列直接构造日期
如果你不想用递归,也可以通过生成1到12的数字序列来直接构造每个月的5日。这里有两种写法:
写法A:利用系统表生成数字序列
SQL Server的master.dbo.spt_values表自带数字序列,我们可以直接拿来用:
DECLARE @TargetYear INT = 2024; SELECT CAST(CONCAT(@TargetYear, '-', RIGHT('0' + CAST(n.number AS VARCHAR(2)), 2), '-05') AS DATE) AS Month5Date FROM master.dbo.spt_values n WHERE n.type = 'P' AND n.number BETWEEN 1 AND 12;
写法B:手动定义数字序列(更稳妥)
如果你的环境不允许使用系统表,或者想避免依赖,可以手动生成1-12的月份数字:
DECLARE @TargetYear INT = 2024; SELECT CAST(CONCAT(@TargetYear, '-', RIGHT('0' + CAST(MonthNum AS VARCHAR(2)), 2), '-05') AS DATE) AS Month5Date FROM ( VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12) ) AS Months(MonthNum);
这种方式完全独立,适配所有SQL Server版本。
方法三:纯日期函数计算(无字符串拼接)
如果你偏好纯日期函数操作,避免字符串拼接,可以用这种方式:
DECLARE @TargetYear INT = 2024; SELECT -- 先生成目标年份的1月1日,再逐月偏移,最后加4天得到当月5日 DATEADD(DAY, 4, DATEADD(MONTH, n.number - 1, DATEFROMPARTS(@TargetYear, 1, 1))) AS Month5Date FROM master.dbo.spt_values n WHERE n.type = 'P' AND n.number BETWEEN 1 AND 12;
这个方法通过日期函数直接计算,性能更优,也避免了字符串转换可能出现的问题。
扩展:关联你的业务表查询数据
如果需要从你的日期表中获取这些日期对应的业务数据,只需要把生成的日期作为CTE/子查询,和你的表关联即可:
DECLARE @TargetYear INT = 2024; WITH MonthlyDates AS ( SELECT CAST(CONCAT(@TargetYear, '-01-05') AS DATE) AS Month5Date UNION ALL SELECT DATEADD(MONTH, 1, Month5Date) FROM MonthlyDates WHERE DATEPART(YEAR, DATEADD(MONTH, 1, Month5Date)) = @TargetYear ) SELECT t.* FROM YourDateTable t -- 替换成你的表名 JOIN MonthlyDates md ON t.YourDateColumn = md.Month5Date; -- 替换成你的日期字段名
内容的提问来源于stack exchange,提问作者Biswa
相关产品推荐
相关产品推荐

