SQL Server:使用MONTH(DATEADD(M,6,@ start))从日历月开始的会计月份将在7月份作为13

时间:2017-07-27 06:42:11

标签: sql-server dateadd

我错过了这里的逻辑,但是我试图从一个日历月开始计算一个会员月。

代码:

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)

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可能不是每个产生的一个月的数字。