【发布时间】:2017-07-27 06:42:10
【问题描述】:
我错过了这里的逻辑,但我试图从日历月中创建一个财政月。
代码:
declare @start datetime,
@end datetime
set @start = '2012-01-01'
set @end = '2017-06-30'
;
with
calendar(date,y,q,m,d,dw,monthname,fy,fm) as
(
select @start,
year(@start),
datepart(qq,@start),
datepart(mm,@start),
datepart(dd,@start),
datepart(dw,@start),
datename(month, @start),
CASE WHEN DatePart(Month, @start) >= 6
THEN DatePart(Year, @start) + 1
ELSE DatePart(Year, @start)
END,
MONTH(DATEADD(M, 6, @start))
union all
select date + 1,
year(date + 1),
datepart(qq,date + 1),
datepart(mm,date + 1),
datepart(dd,date + 1),
datepart(dw,date + 1),
datename(month, date + 1),
CASE WHEN DatePart(Month, date) >= 6
THEN DatePart(Year, date) + 1
ELSE DatePart(Year, date)
END,
MONTH(DATEADD(M, 6, date)) + 1
from calendar where date + 1 < @end
)
select * from calendar
where d =1
option(maxrecursion 10000)
结果:
7 月结束后一切正常,13 结束??应该是 1(7+6=13,所以 1)
【问题讨论】:
-
你为什么不在这些计算的递归部分重复将
@start替换为date + 1的模式? (我假设,你还没有说,fm打算是会计月份)
标签: sql-server dateadd