如何获取日期范围内的月份名称和月份结束日期

How to get Month name and End Date of Month within a date rage

在给定的日期范围内,我想获得月份的名称和月份的结束日期。根据给定的值,我将不同的计数并计算最终值。

我可以用 CTE 做到,但我不知道如何用 CTE 完全做到。

与使用 CTE 相比,我更喜欢一种方法。

SQL2008 R2,2012 版本。

我想要我提供的完整日期范围内的结果。不是一个月

示例:我提供的输入是日期范围

Declare @Start datetime
Declare @End datetime

Select @Start = '2014-08-08'
Select @End = '2015-04-01'

需要输出:

Month     End Date

August    2014-08-31 00:00:00.000

September 2014-09-30 00:00:00.000

October   2014-10-31 00:00:00.000

November  2014-11-30 00:00:00.000

December  2014-12-31 00:00:00.000

January   2015-01-31 00:00:00.000

February  2015-02-28 00:00:00.000

March     2015-03-31 00:00:00.000

对于 2012+ 或 2012-

DECLARE @Start DATETIME = '2014-08-08',
        @End DATETIME = '2015-04-01'


SELECT  DATENAME(MONTH, DATEADD(MONTH, a.number, @Start)) AS NameOfMonth
        ,EOMONTH(DATEADD(MONTH, a.number, @Start)) AS EndOfMonthForSQL2012Plus
        ,DATEADD(DAY, -1, DATEADD(MONTH, 1 + DATEDIFF(MONTH, 0, DATEADD(MONTH, a.number, @Start)), 0)) AS EndOfMonthForSQL2012Minus
FROM    master.dbo.spt_values a
WHERE   a.type = 'P'        
AND     a.number <= DATEDIFF(MONTH, @Start, @End);

适用于 SQL SERVER 2008+

Declare @Start datetime Declare @End datetime

Select @Start = '2014-08-08' Select @End = '2015-04-01'
declare @day DATETIME = @Start

declare @tab TABLE(MONTH_NAME varchar(20),LAST_DAY_OF_MONTH DATETIME)

while @day <= @end
begin
    INSERT INTO 
        @tab
    SELECT
        DATENAME(month, @day),
        DATEADD(SECOND,-1,DATEADD(MONTH,1+ DATEDIFF(MONTH, 0, @day), 0))

    set @day = DATEADD(MONTH,1,@day)        
end

    SELECT
        *
    FROM
        @tab

我以前用过下面的。它需要一个开始日期,但您需要自己的结束日期;

DECLARE @SeedDate DATETIME = '1 February 2015'

;WITH CalData AS (

SELECT DATENAME(MONTH, @SeedDate) AS Name,
       @SeedDate As StartDate,
       DATEADD(MONTH, ((YEAR(@SeedDate) - 1900) * 12) + MONTH(@SeedDate), -1) AS EndDate
UNION ALL
SELECT DATENAME(MONTH, DATEADD(MONTH, 1, StartDate)),
       DATEADD(MONTH, 1, StartDate), 
       DATEADD(MONTH, ((YEAR(StartDate) - 1900) * 12) + (MONTH(StartDate) + 1), -1)
FROM CalData

) SELECT TOP 200 * FROM CalData
OPTION (MAXRECURSION 5000);

要获取该月的最后一天:

Link 1

获取月份名称:

Link 2

Link 3