【问题标题】:SQL Server: Fiscal month from calendar month using MONTH(DATEADD(M, 6, @start)) results in July as 13SQL Server:使用 MONTH(DATEADD(M, 6, @start)) 的日历月的会计月份在 7 月结果为 13
【发布时间】: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


【解决方案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)

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

【讨论】:

  • Thankyou Damien 感谢您的专业知识!
猜你喜欢
  • 2014-04-26
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多