2015-05-19 55 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

相关问题