我需要生成看起來像這樣的日期值的表:如何生成一個表格,其中每一行代表每個月的最後一天?
01/31/2015
02/28/2015
03/31/2015
04/30/2015
....
12/31/2015
各值代表每個月的最後一天。什麼是最好的方法來完成這個?
我需要生成看起來像這樣的日期值的表:如何生成一個表格,其中每一行代表每個月的最後一天?
01/31/2015
02/28/2015
03/31/2015
04/30/2015
....
12/31/2015
各值代表每個月的最後一天。什麼是最好的方法來完成這個?
@sDate是開始日期,@eDate是結束日期。
declare @sDate datetime,
@eDate datetime
select @sDate = '2013-02-25',
@eDate = '2013-04-25'
;with cte as (
select convert(date,left(convert(varchar,@sdate,112),6) + '01') startDate,
month(@sdate) n
union all
select dateadd(month,n,convert(date,convert(varchar,year(@sdate)) + '0101')) startDate,
(n+1) n
from cte
where n < month(@sdate) + datediff(month,@sdate,@edate)
)
select dateadd(day,-1,dateadd(month,1,startdate)) as enddate
from cte
結果:
2013-02-28
2013-03-31
2013-04-30
SELECT MonthEnd = DATEADD(ms, -3, DATEADD(m, DATEDIFF(m, 0, GETDATE()) + 1 + A.N, 0))
FROM (VALUES -- Feel free to replace this with some sort of numbers table
(0), (1), (2), (3), (4), (5)
) A (N)
這是一個非常整潔的解決方案。謝謝! – Red
沒問題。如果您想使其更靈活,請執行註釋,並用數字表/ TVF替換硬編碼的數字範圍。 – Kittoes0124
您可以使用EOMONTH讓每個月底,並根據當你要停在一個while循環。當然,你可以選擇這些到一個臨時表或東西以備以後使用....
DECLARE @STARTDATE DATETIME
DECLARE @ENDDATE DATETIME
SET @STARTDATE = GETDATE()
SET @ENDDATE = '2015-12-31'
WHILE @STARTDATE < @ENDDATE
BEGIN
SELECT EOMONTH(@STARTDATE)
SET @STARTDATE = DATEADD(M,+1,@STARTDATE)
END
注意:只適用於SQL Server 2012及更高版本。 – Kittoes0124
使用DATEADD()每個月的第一天,你用字符串連接建立之前得到的一天。 –
它有幫助有一個日曆或數字表。 http://sqlperformance.com/2013/01/t-sql-queries/generate-a-set-3 –