我错过了这里的逻辑,但是我试图从一个日历月开始计算一个会员月。
代码:
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)
答案 0 :(得分:1)
如果意图是财政年度从7月到6月,那么似乎是一些错别字/不匹配的比较。
最明显的是,只需将@start
替换为date + 1
,而不是尝试将更正应用于&#34;外部&#34;的计算。然后,这揭示了其他问题:
declare @start datetime
declare @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 /* not >= unless June is meant to be the start date */
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+1) > 6 /* ditto */
THEN DatePart(Year, date+1) + 1
ELSE DatePart(Year, date+1)
END,
MONTH(DATEADD(M, 6, date+1))
from calendar where date + 1 <= @end /* Include final day of period? */
)
select * from calendar
where d =1
option(maxrecursion 10000)
一些简单的实验应该告诉您,对MONTH
(只能返回1到12之间的值)的调用的结果中添加1可能不是每个产生的一个月的数字。