我需要生成看起来像这样的日期值的表:如何生成一个表格,其中每一行代表每个月的最后一天?
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 –