Sql server SQL Server:使用月份(DATEADD(M,6,@start))从日历月算起的会计月结果为7月13日

Sql server SQL Server:使用月份(DATEADD(M,6,@start))从日历月算起的会计月结果为7月13日,sql-server,dateadd,Sql Server,Dateadd,我不明白这里的逻辑,但我正试图从日历月改为财政月 代码: 结果: 每件事都很有效,除了7月,结果是13??应该是17+6=13,因此1似乎是比较的一些错误/不匹配,如果目的是会计年度从7月到6月 最明显的是,只需从根本上重复将@start替换为date+1的模式,而不是尝试对计算外部应用更正。这就揭示了其他问题: declare @start datetime declare @end datetime set @start = '2012-01-01' set @end = '2017-06-

我不明白这里的逻辑,但我正试图从日历月改为财政月

代码:

结果:


每件事都很有效,除了7月,结果是13??应该是17+6=13,因此1似乎是比较的一些错误/不匹配,如果目的是会计年度从7月到6月

最明显的是,只需从根本上重复将@start替换为date+1的模式,而不是尝试对计算外部应用更正。这就揭示了其他问题:

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)

一些简单的实验应该告诉您,在只能返回1到12之间的值的MONTH调用的结果中添加1不可能每个月都产生1。

为什么不在这些计算的递归部分重复将@start替换为date+1的模式?我想,你还没有说过,fm将是一个财政月。谢谢你的专业知识!
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)