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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 23:02:36