计算财政年度

时间:2018-03-14 13:25:46

标签: tsql reporting-services

我正在生成一个案例陈述,它将作为我们报告日期范围的主共享数据集,因为我们经常使用相同的日期范围。目前我有上周,上个月,上一年,当前周,当月和当年。我想添加我们的会计年度(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]

2 个答案:

答案 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)作为财政年度