实现这个功能,先参考下面几篇博文《T-SQL获取二月份天数》https://www.cnblogs.com/insus/archive/2011/04/22/2025019.html
《如何获取月份的天数》https://www.cnblogs.com/insus/archive/2011/09/10/2173028.html
《获取指定日期所在月份的第一天》https://www.cnblogs.com/insus/archive/2011/09/11/2173612.html
可以写一个Table-valued Functions:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Insus.NET -- Create date: 2019-05-09 -- Update date: 2019-05-09 -- Description: 获取指定月份所有日期 -- ============================================= CREATE FUNCTION [dbo].[tvf_DaysOfMonth] ( @InputDate DATETIME ) RETURNS @dump TABLE ( [Date] DATETIME ) AS BEGIN DECLARE @firstDayOfMonth DATETIME = DATEADD(MONTH,DATEDIFF(MONTH,0,@InputDate),0) --获取所在月份第一天日期 DECLARE @daysOfMonth INT = DAY(DATEADD(DAY,-1, DATEADD(MONTH,1,@firstDayOfMonth))) --获取所在月份的天数 INSERT INTO @dump ([Date]) VALUES(@firstDayOfMonth) --把第一天插入表中。 DECLARE @d INT = 1 WHILE @d < @daysOfMonth BEGIN INSERT INTO @dump ([Date]) VALUES(@firstDayOfMonth + @d) SET @d = @d + 1 END RETURN ENDSource Code
例子说明:
如果想更多的写法参考, Insus.NET更改了上面的自定义函数,先是获取指定日期所在月份的第一天日期,然后获取指定日期下一个月份的第一天日期。
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Insus.NET -- Create date: 2019-05-09 -- Update date: 2019-05-09 -- Description: 获取指定月份所有日期 -- ============================================= CREATE FUNCTION [dbo].[tvf_DaysOfMonth] ( @InputDate DATETIME ) RETURNS @dump TABLE ( [Date] DATETIME ) AS BEGIN DECLARE @firstDayOfMonth DATETIME = DATEADD(MONTH,DATEDIFF(MONTH,0,@InputDate),0) --获取指定月份第一天日期 DECLARE @firstDayOfNexMonth DATETIME = DATEADD(MONTH,1,@firstDayOfMonth) --获取指定月份下一个月份的第一天日期 DECLARE @dumpDate DATETIME = @firstDayOfMonth WHILE (@dumpDate < @firstDayOfNexMonth) BEGIN INSERT INTO @dump ([Date]) VALUES(@dumpDate) SET @dumpDate = @dumpDate + 1 END RETURN ENDSource Code
上面2个自定义函数均可以使用。