使用数字表格可以让事情更轻松。如果你不已经有一个数字表,你可以使用下面的SQL创建一个(从this SO post拍摄):
SELECT TOP 10000 IDENTITY(int,0,1) AS Number
INTO Tally
FROM sys.objects s1
CROSS JOIN sys.objects s2
ALTER TABLE Tally ADD CONSTRAINT PK_Tally PRIMARY KEY CLUSTERED (Number)
要了解更多有关数字表以及如何使用它,阅读杰夫MODEN的The "Numbers" or "Tally" Table: What it is and how it replaces a loop文章。
一旦你有一个数字表,它是用2012或更高版本相当容易,使用内置在功能上EOMONTH
:
DECLARE @Start date = '2015-01-01', @End date = '2017-01-01'
SELECT EOMONTH(DATEADD(MONTH, Number, @Start))
FROM Tally
WHERE Number < DATEDIFF(MONTH, @Start, @End)
对于早期版本,您可以使用DATEADD
与DATEDIFF
得到的最后一天前一个月,然后只需添加一个月份:
SELECT DATEADD(DAY, -DATEPART(DAY, @Start), (DATEADD(MONTH, Number+1, @Start)))
FROM Tally
WHERE Number < DATEDIFF(MONTH, @Start, @End)
See a live demo on rextester
您使用的是哪个版本的sql server? –