2015-05-19 70 views
0

我需要生成看起來像這樣的日期值的表:如何生成一個表格,其中每一行代表每個月的最後一天?

01/31/2015 
02/28/2015 
03/31/2015 
04/30/2015 
.... 
12/31/2015 

各值代表每個月的最後一天。什麼是最好的方法來完成這個?

+0

使用DATEADD()每個月的第一天,你用字符串連接建立之前得到的一天。 –

+0

它有幫助有一個日曆或數字表。 http://sqlperformance.com/2013/01/t-sql-queries/generate-a-set-3 –

回答

1

@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 
1
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) 
+0

這是一個非常整潔的解決方案。謝謝! – Red

+0

沒問題。如果您想使其更靈活,請執行註釋,並用數字表/ TVF替換硬編碼的數字範圍。 – Kittoes0124

0

您可以使用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 
+0

注意:只適用於SQL Server 2012及更高版本。 – Kittoes0124

相關問題