如何获取日期范围内的月份名称和月份结束日期
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 2
在给定的日期范围内,我想获得月份的名称和月份的结束日期。根据给定的值,我将不同的计数并计算最终值。
我可以用 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 2