【问题标题】:Grouping Fiscal year using SQL Server使用 SQL Server 对会计年度进行分组
【发布时间】:2010-10-09 17:26:30
【问题描述】:

SQL Server 中是否有一种方法可以从具有日期列(1998 到 2010)的表中显示会计年度(从 10 月 1 日开始,到 9 月 30 日结束)。这是我所做的:

select 'FY1999' as FY, site, count(*)
from mytable
where mydate >='10/1/1998' 
    and mydate <'10/1/1999'
group by site

select 'FY2000' as FY, site, count(*)
from mytable
where mydate >='10/1/1999' 
    and mydate <'10/1/2000'
group by site

select 'FY2001' as FY, site, count(*)
from mytable
where mydate >='10/1/2000' 
    and mydate <'10/1/2001'
group by site

在超过 10 个 FY 年的时间里这样做是不是太重复了?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这里有一个查询,可以为您提供所需的信息。

    SELECT DATEPART(yyyy, DATEADD(mm, 3, mydate)) AS FY, site, COUNT(*) AS row_count
    FROM mytable
    GROUP BY DATEPART(yyyy, DATEADD(mm, 3, mydate)), site
    

    【讨论】:

    • 哇,我从来没想过要这样做,真是个好主意,就是这么简单!我喜欢这个,因为它使查询保持独立。
    【解决方案2】:

    您甚至可以在 SQL Server 中创建用户定义的函数,该函数接受日期参数并将会计年度作为 int 返回:

    CREATE FUNCTION GetFiscalYear(@TheDate date)
    RETURNS int
    AS
    BEGIN
        DECLARE @FiscalYear int  
    
        IF DATEPART(month, @TheDate) < 10
            SELECT @FiscalYear = DATEPART(year, @TheDate)
        ELSE
            SELECT @FiscalYear = DATEPART(year, @TheDate) + 1  
    
        RETURN @FiscalYear
    END
    

    那么你可以这样使用,例如:

    SELECT Id, ShippingDate, GetFiscalYear(ShippingDate)
    FROM SomeTable
    

    【讨论】:

      【解决方案3】:

      是的,它有点重复。我会使用 DatePart 和一些易于识别的规则:

      • 如果月份小于 10,则会计年度是日期的年份。
      • 会计年度是日期的年份 + 1 如果月份 >= 10

      【讨论】:

        【解决方案4】:

        这是英国的动态脚本,四月到三月, 对于不同的日期,您可以用作参考,

        祝你好运

        DECLARE @StartDate DATETIME
        DECLARE @EndDate DATETIME
        
        SET @StartDate = DATEADD(dd,0, DATEDIFF(dd,0, DATEADD( mm, -(((12 + DATEPART(m, getDate())) - 4)%12), getDate() ) - datePart(d,DATEADD( mm, -(((12 + DATEPART(m, getDate())) - 4)%12),getDate() ))+1 ) )  
        
        SET @EndDate = DATEADD(SS,-1,DATEADD(mm,12,@StartDate))
        
        SELECT @StartDate,@EndDate
        

        【讨论】:

          【解决方案5】:

          财政年度开始:

          DATEADD(MONTH, DATEDIFF(MONTH, '20100401', getdate()) / 12 * 12, '20100401')
          

          财政年度结束

          DATEADD(MONTH, DATEDIFF(MONTH, '20100401', getdate()) / 12 * 12, '20110331')
          

          如果需要,请将getdate() 替换为您自己的日期

          【讨论】:

            【解决方案6】:

            我没有方便的 SQL 服务器参考,但这是我在 MySQL 中的做法:

            select date_format (date_add(mydate, interval 92 days), 'FY%Y') as FY, site, count(*)
             from mytable
             group by FY, site;
            

            10 月、11 月和 12 月有 92 天,所以我已经抵消了这么多。

            【讨论】:

            • 这与@bobs 在下面的回答中的内容相同。这家伙应该得到一些不被否决的东西
            • @hiFI:感谢您指出这一点。鲍勃的回答是在我回答后四个小时给出的。你为什么不惹他?另外,您是否注意到这个答案已经快 9 岁了?
            【解决方案7】:

            昨天有这个问题的答案,后来被删除了。 我不知道为什么。有什么问题吗?

            请不要对这个答案投反对票,我只是想知道它为什么被删除。

            经过严格的测试,我仍然无法对其进行故障排除。在我的示例中,会计年度从 7 月 1 日开始。

            答案是:

            SELECT SUM(value), CAST(Year(DateAdd(Month, -6, TransactionDate)) as varchar) + ' - ' + CAST(Year(DateAdd(Month, 6, TransactionDate)) as varchar) as 'FY'
            FROM          mytable
            GROUP BY CAST(Year(DateAdd(Month, -6, mydate)) as varchar) + ' - ' + CAST(Year(DateAdd(Month, 6, mydate)) as varchar)
            

            【讨论】:

              【解决方案8】:

              这里是一些基于 Simon 回答的测试 Sql

                  DECLARE @basestartdate datetime, @baseenddate datetime
              SET @basestartdate = CAST('1 April 1753' AS datetime)
              SET @baseenddate = CAST('31 March 1754' AS datetime)
              
              ;
              WITh TestData as
              (
              SELECT
                  CAST('1 April 2015' AS datetime) input,
                  CAST('1 April 2015' AS datetime) expectedstartdate,
                  CAST('31 March 2016' AS datetime) expectedenddate UNION SELECT
                  CAST('2 April 2015' AS datetime),
                  CAST('1 April 2015' AS datetime),
                  CAST('31 March 2016' AS datetime) UNION SELECT
                  CAST('31 December 2015' AS datetime),
                  CAST('1 April 2015' AS datetime),
                  CAST('31 March 2016' AS datetime) UNION SELECT
                  CAST('1 January 2016' AS datetime),
                  CAST('1 April 2015' AS datetime),
                  CAST('31 March 2016' AS datetime) UNION SELECT
                  CAST('28 February 2016' AS datetime),
                  CAST('1 April 2015' AS datetime),
                  CAST('31 March 2016' AS datetime) UNION SELECT
                  CAST('31 March 2016' AS datetime),
                  CAST('1 April 2015' AS datetime),
                  CAST('31 March 2016' AS datetime) UNION SELECT
                  CAST('1 April 2016' AS datetime),
                  CAST('1 April 2016' AS datetime),
                  CAST('31 March 2017' AS datetime)
              ),
              Results AS
              (
              SELECT
                  input,
                  expectedstartdate,
                  DATEADD(MONTH, 
                          12 * (DATEDIFF(MONTH, @basestartdate, input) / 12),
                          @basestartdate) startdate,
                  expectedenddate,
                  DATEADD(MONTH, 
                          12 * (DATEDIFF(MONTH, @basestartdate, input) / 12),
                          @baseenddate) enddate
              FROM testdata
              )
              SELECT
                  CASE
                      WHEN (expectedstartdate = startdate) THEN 'Pass' ELSE 'Fail'
                  END startdateresult,
                  CASE
                      WHEN (expectedenddate = enddate) THEN 'Pass' ELSE 'Fail'
                  END startdateresult
              FROM results
              ORDER BY input
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-05-04
                • 2016-06-04
                • 2010-10-03
                • 1970-01-01
                • 2012-01-25
                相关资源
                最近更新 更多