我正在生成一个案例陈述,它将作为我们报告日期范围的主共享数据集,因为我们经常使用相同的日期范围。目前我有上周,上个月,上一年,当前周,当月和当年。我想添加我们的会计年度(10/1到9/30),但我还没有想出一个纯粹的SQL方法来做到这一点。
DECLARE @frequency as nvarchar(20);
SET @frequency = 'CURRENT MONTH'
SELECT
CASE @frequency
WHEN 'PREVIOUS MONTH' THEN CONVERT(DATE,DATEADD(m,DATEDIFF(m,0,GETDATE())-1,0))
WHEN 'CURRENT MONTH' THEN CONVERT(DATE,DATEADD(dd, 0, DATEDIFF(dd, 0, DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()))))
WHEN 'CURRENT WEEK' THEN CONVERT(DATE,DATEADD(dd, 1, DATEDIFF(dd, 0,DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATETIME)))))
WHEN 'PREVIOUS WEEK' THEN CONVERT(DATE,DATEADD(dd, -6, DATEDIFF(dd, 0,DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATETIME)))))
WHEN 'CURRENT YEAR' THEN CONVERT(DATE, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))
WHEN 'PREVIOUS YEAR' THEN CONVERT(DATE, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) - 1, 0))
END as [START DATE],
CASE @frequency
WHEN 'PREVIOUS MONTH' THEN CONVERT(DATE,DATEADD(dd, 0, DATEDIFF(dd, 0,DATEADD(ms,-2,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)))))
WHEN 'CURRENT MONTH' THEN CONVERT(DATE,DATEADD(D, -1, DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()) + 1, '19000101')))
WHEN 'CURRENT WEEK' THEN CONVERT(DATE,DATEADD(dd, 1, DATEDIFF(dd, 0,DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATETIME)))))
WHEN 'PREVIOUS WEEK' THEN CONVERT(DATE,DATEADD(dd, -6, DATEDIFF(dd, 0,DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATETIME)))))
WHEN 'CURRENT YEAR' THEN CONVERT(DATE, DATEADD(ms, -2, DATEADD(YEAR, 0, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) + 1, 0))))
WHEN 'PREVIOUS YEAR' THEN CONVERT(DATE, DATEADD(ms, -2, DATEADD(YEAR, 0, DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0))))
END as [END DATE]
答案 0 :(得分:1)
我发现执行此逻辑的最简单方法是将日期偏移。如果10/1/2018属于2018财年,则扣除9个月将日期转换为1/1/2018。然后得到年份值。
YEAR(DATEADD(MONTH,-9,'2018-09-01')) = 2017
YEAR(DATEADD(MONTH,-9,'2019-09-01')) = 2018
YEAR(DATEADD(MONTH,-9,[YourDateField]))
有了这个,您还可以计算财政月
MONTH(DATEADD( month, -9, '2018-09-01 )) = 12
我的公司使用FY结束的年份,所以10/1/2018将成为2019财年结束的一部分。对于我的安排,我需要增加3个月而不是减去才能使计算结果正确。
此方法仅使用日期数学,因此在大多数情况下应该能够使用索引。
要查找您正在寻找的日期部分的指定日期,请尝试以下操作:
SELECT CurrentWeek = DATEADD( WEEK, DATEDIFF( WEEK, '2018-01-01', GETDATE()), '2018-01-01' ),
CurrentMonth = DATEADD( MONTH, DATEDIFF( MONTH, '2018-01-01', GETDATE()), '2018-01-01' ),
CurrentYear = DATEADD( YEAR, DATEDIFF( YEAR, '2018-01-01', GETDATE()), '2018-01-01' )
;
通过将计算基于种子日期,您不需要截断较小的时间值。
答案 1 :(得分:1)
根据您的计算,这将有效:
DECLARE @frequency as nvarchar(20);
SET @frequency = 'FINANCIAL YEAR'
SELECT
CASE @frequency
WHEN 'FINANCIAL YEAR' THEN CONVERT(date, DATEADD(month, -1,
DATEADD(year, -1, DATEADD(month, -8, DATEADD(month, 13-MONTH(GETDATE()),
DATEDIFF(month, 0, GETDATE()), 0))))))
END as [START DATE],
CASE @frequency
WHEN 'FINANCIAL YEAR' THEN CONVERT(date, DATEADD(ms, -2,
DATEADD(month, -8, DATEADD(month, 13-MONTH(GETDATE()), DATEADD(month,
DATEDIFF(month, 0, GETDATE()), 0)))))
END as [END DATE];
使用-8来改变财政年度 - 例如如果金融年份如果从2017-03到2018-03,那么它将是-9。 我希望这对你有所帮助! 附:我使用April(从2017-04到2018-04)作为财政年度