显示某个财政年度的某个季度

时间:2012-01-05 07:06:10

标签: sql sql-server sql-server-2008 tsql finance

我正在尝试构建一个查询,该查询将映射两个列,一个是表格中的日期,第二列是别名,以显示日期所属的季度和财政年度。

不幸的是,我没有足够的SQL知识来知道从哪里开始。我知道我会使用getdate()dateadd(MONTH,,)的组合执行此操作,但是我所放在一起的任何内容都已接近工作。

为了进一步复杂化,澳大利亚的财政年度将从7月1日至6月30日开始,因此2012财年第一季度将从2012年7月1日开始。

我可以在没有声明的情况下执行此操作,但是我更愿意在声明中使用它,因为它将用于SSRS报告和C#应用程序,它将使维护变得更加容易。

17 个答案:

答案 0 :(得分:10)

这应该有效: -

SELECT
    MyDate,
    CASE
        WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN convert(char(4), YEAR(MyDate) - 1) + 'Q3'
        WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN convert(char(4), YEAR(MyDate) - 1) + 'Q4'
        WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN convert(char(4), YEAR(MyDate) - 0) + 'Q1'
        WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN convert(char(4), YEAR(MyDate) - 0) + 'Q2'
    END AS Quarter
FROM
    MyTable

输出: -

MyDate        Quarter
----------    --------
2011-01-01    "2010Q3"
2011-04-01    "2010Q4"
2011-07-01    "2011Q1"
2011-10-01    "2011Q2"

答案 1 :(得分:6)

我认为使用CASE

执行此操作最简单
SELECT
   date
   , CASE
         WHEN MONTH(date) BETWEEN 7 AND 9 THEN 'First Quarter'
         WHEN MONTH(date) BETWEEN 10 AND 12 THEN 'Second Quarter'
         WHEN MONTH(date) BETWEEN 1 AND 3 THEN 'Third Quarter'
         WHEN MONTH(date) BETWEEN 4 AND 6 THEN 'Fourth Quarter'
     END AS quarter
FROM Stuff

答案 2 :(得分:6)

此方法不需要CASE语句,适用于任何月度会计日历。

DECLARE @firstMonthOfFiscalQ1 int = 7; --1=January
SELECT DateColumn
    , FLOOR(((12 + MONTH(DateColumn) - @firstMonthOfFiscalQ1) % 12) / 3 ) + 1 AS FiscalQuarter
    FROM SomeTable 
    WHERE 1=1;

答案 3 :(得分:4)

以防万一你想做一些古怪的数学运算以避免一个案例陈述:

select mydate,
   convert(char(4), year(mydate) - (((DATEPART(qq, mydate) - ((DATEPART(qq, mydate) + 1) % 4) + 1) / -4) + 1)) + 
   'Q' + convert(char(1), ((DATEPART(qq, mydate) + 1) % 4) + 1) quar
from sampleData

答案 4 :(得分:3)

考虑从数据仓库创建等效的Date Dimension表。这样每年你的数据可能会覆盖一行(从一些合理的时代开始,直到某个合理的未来日期)。

在此表中,您将拥有描述每天信息的列 - 包括日历年,半年,季度,月;和财政年度,半年,季度。

然后,您的报告会根据日期加入此表以提取此信息。这为您提供了有关日期的其他信息的未来支持,并从每个单独的报告查询中删除了此计算的责任。

答案 5 :(得分:1)

我发现使用' Explosion Pills '结果有效,但我想通过' Adam Ralph '看起来像我的答案,但是我一直遇到错误。我能够解决这个问题,并创建了一个新的CASE示例:

    CASE    -- Results:  2011 (Financial Year )
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN (YEAR(MyDate) - 1)
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN (year(MyDate) - 1)
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN (YEAR(MyDate) - 0)
            WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN (YEAR(MyDate) - 0)
    END AS FYr,

    CASE    -- Results:  Q4 (Financial Qtr)
            WHEN MONTH(MyDate) BETWEEN 7 AND 9 THEN 'Q1'
            WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN 'Q2'
            WHEN MONTH(MyDate) BETWEEN 1 AND 3 THEN 'Q3'
            WHEN MONTH(MyDate) BETWEEN 4 AND 6 THEN 'Q4'
    END AS FQtr,

            -- https://stackoverflow.com/a/22170892/2337102
    CASE    -- Results:  2011-Q4  (Financial Yr-Qtr)
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN concat((YEAR(MyDate) - 1), '-', 'Q3')
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN concat((YEAR(MyDate) - 1), '-', 'Q4')
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN concat((YEAR(MyDate) - 0), '-', 'Q1')
            WHEN MONTH(MyDate) BETWEEN 10 AND 12 THEN concat((YEAR(MyDate) - 0), '-', 'Q2')
    END AS FYrQtr,


    CASE    --  Results:  11-Q4   (Financial (short) Yr-Qtr)
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN concat((date_format(MyDate, '%y') - 1), '-', 'Q3')
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN concat((date_format(MyDate, '%y') - 1), '-', 'Q4')
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN concat((date_format(MyDate, '%y') - 0), '-', 'Q1')
            WHEN MONTH(MyDate) BETWEEN 10  AND 12  THEN concat((date_format(MyDate, '%y') - 0), '-', 'Q2')
    END AS FYrQtr,

    CASE    --  Results:  2011-2012/Q4  (Financial Range Yr/Qtr)
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN concat(YEAR(MyDate) - 1,'-', YEAR(MyDate), '/', 'Q3')
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN concat(YEAR(MyDate) - 1,'-', YEAR(MyDate),  '/', 'Q4')
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN concat(YEAR(MyDate) - 0,'-', YEAR(MyDate) + 1,  '/', 'Q1')
            WHEN MONTH(MyDate) BETWEEN 10  AND 12  THEN concat(YEAR(MyDate) - 0,'-', YEAR(MyDate) + 1,  '/', 'Q2')
    END AS FRangeQtr,

    CASE    --  Results:  11-12/Q4  (Financial Range (short) Yr/Qtr)
            WHEN MONTH(MyDate) BETWEEN 1  AND 3  THEN concat((date_format(MyDate, '%y') - 1),'-', (date_format(MyDate, '%y')), '/', 'Q3')
            WHEN MONTH(MyDate) BETWEEN 4  AND 6  THEN concat((date_format(MyDate, '%y') - 1),'-', (date_format(MyDate, '%y')), '/', 'Q4')
            WHEN MONTH(MyDate) BETWEEN 7  AND 9  THEN concat((date_format(MyDate, '%y') - 0),'-', (date_format(MyDate, '%y') + 1), '/', 'Q1')
            WHEN MONTH(MyDate) BETWEEN 10  AND 12  THEN concat((date_format(MyDate, '%y') - 0),'-', (date_format(MyDate, '%y') + 1), '/', 'Q2')
    END AS FRangeQtr2,

我正在添加我的答案,希望它可以帮助通过Google访问并遇到问题的其他人。

答案 6 :(得分:1)

游戏晚了几年,但这是我使用GetDate()为澳大利亚人准备的快速简便的方法。甚至您的会计日历都是颠倒的:)

SELECT CHOOSE(MONTH(GetDate()),'3Q','3Q','3Q','4Q','4Q','4Q','1Q','1Q','1Q','2Q','2Q','2Q') AS AccountingQuarter

SQL选择命令将日期中的月份作为参数,然后从12个可用选项中进行选择。当然,大多数其他系统将首先以1Q / Q1开始。

答案 7 :(得分:0)

我偶然偶然发现了这篇文章,但没有找到简单的答案。我要做的就是使用适用的函数添加正确的月份数,然后获取适当季度的所需字符串。保持简单永远是最好的。

年末从8月开始,因此将日期推迟5个月。 MSACCESS中的一个示例:

季度:DatePart('yyyy',DateAdd('m',+ 5,[YOURDATEFIELD]))&“ / Q”&DatePart('q',DateAdd('m',+ 5,[YOURDATEFIELD]) )

答案 8 :(得分:0)

我们已经有一个sysDate表,其中包含从1900年1月1日到2030年12月31日的日期,我们将这些日期用于处理。我们被要求进行会计年度处理,因此我们修改了表格,使其包含FiscalYearString varchar(9)FiscalYear intFiscalQuarter int列。

我们用来更新这些列的脚本是这样的:

DECLARE @StartingMonthOfFiscalYear INT = 4 -- 1-Jan, 2-Feb, 3-Mar, 4-Apr, 5-May, 6-Jun, 7-Jul, 8-Aug, 9-Sep, 10-Oct, 11-Nov, 12-Dec

UPDATE sysDate
SET FiscalYear = CASE WHEN MONTH([Date]) < @StartingMonthOfFiscalYear 
                        THEN YEAR([Date])-1 
                        ELSE YEAR([Date]) END,
    FiscalYearString = CASE WHEN MONTH([Date]) < @StartingMonthOfFiscalYear 
                        THEN CAST(YEAR([Date])-1 AS Varchar(4))+'/'+CAST(YEAR([Date]) AS Varchar(4)) 
                        ELSE CAST(YEAR([Date]) AS Varchar(4))+'/'+CAST(YEAR([Date])+1 AS Varchar(4)) END,
    FiscalQuarter = CASE WHEN MONTH([Date]) < @StartingMonthOfFiscalYear 
                        THEN ((MONTH([Date]) + 12 - @StartingMonthOfFiscalYear) / 3) + 1 
                        ELSE ((MONTH([Date]) - @StartingMonthOfFiscalYear) / 3) + 1 END

这将在不到1秒的时间内更新超过47,000行,从而使我们不必每次都需要重新计算。

答案 9 :(得分:0)

declare @sdate date='2017-12-01'
declare @edate date='2018-07-01'



;with rs as
(
   select   1 [QNum],@sdate StDT
   union all 
   select [QNum]+1, DATEADD(qq,1,stdt)   from rs where [QNum]<=datediff(qq,@sdate,@edate)
)
select QNum, convert(varchar(10),StDT,105) StDT,convert(varchar(10),dateAdd(m,3,DATEADD(d, -1, DATEADD(qq,DATEDIFF(qq, 0, stdt) + 1, 0))),105)EndDT from rs

--select left(datename(mm,s),3) + ' ' +cast(year(s) as varchar) from rs

答案 10 :(得分:0)

此代码将日期转换为年份和月份,即一个季度的开头。

DATEADD(quarter, DATEDIFF(quarter, 0, @date), 0) year_and_first_month_of_quarter

所以这几个月总是如此:
YYYY-的 01 -01
YYYY-的 04 -01
YYYY-的 07 -01
YYYY-的 10 -01
关于它的好处 - 结果是日期时间格式。

答案 11 :(得分:0)

这是替代接受的答案:

declare @tbl table (MyDate datetime)
insert into @tbl values ('2011-01-01')
insert into @tbl values ('2011-04-01')
insert into @tbl values ('2011-07-01')
insert into @tbl values ('2011-10-01')

SELECT CAST(MyDate AS DATE) as MyDate, CAST(YEAR(DATEADD(MONTH, -6, MyDate)) AS VARCHAR(4)) + 'Q'
    + CAST(DATEPART(q,DATEADD(MONTH, -6, MyDate)) AS VARCHAR(1)) AS Quarter
FROM @tbl

输出:

MyDate     Quarter
---------- -------
2011-01-01 2010Q3
2011-04-01 2010Q4
2011-07-01 2011Q1
2011-10-01 2011Q2

即使MyDate类似于8月31日 - 如果你在SQL中从8/31减去6个月,你得到2/28(尽管2/31不存在,MSSQL仍然知道你可能想要这个月的最后一天)。由于该季度基于一年中的月份,因此这种方法有效。

答案 12 :(得分:0)

ServicePrincipal

答案 13 :(得分:0)

SELECT
MyDate,
CASE
    WHEN MONTH(MyDate) IN (1,2,3)  THEN convert(char(4), YEAR(MyDate) - 1) + 'Q3'
    WHEN MONTH(MyDate) IN (4,5,6)  THEN convert(char(4), YEAR(MyDate) - 1) + 'Q4'
    WHEN MONTH(MyDate) IN (7,8,9)  THEN convert(char(4), YEAR(MyDate) - 0) + 'Q1'
    WHEN MONTH(MyDate) IN (10,11,12) THEN convert(char(4), YEAR(MyDate) - 0) + 'Q2'
END AS Quarter  FROM MyTable

上述答案不考虑本季度的最后一个月

例如。介于1和3之间只会返回第1和第2个月...

答案 14 :(得分:0)

也许我不明白这个问题,但接受的答案似乎不正确。财务季度取决于财政年度的哪个月开始,因此它总是(?)是2个日期的计算。

这对我有用,没有案例陈述:

   #socialleft{
     position:fixed; 
     top: 35%; 
     left: 0; 
     height:100%; 
     width:45px;
     margin-left:15px;
     display:block;
     z-index:100;
     transition: width ease .5s;    
   }

答案 15 :(得分:-1)

我今天去寻找答案并决定发布我的解决方案,因为它避免了CASE声明:

select DATEPART(Quarter,dateadd(m,6,YourDate))/* add six months to move to FY */ qq

这是为澳大利亚财政年度写的,经过六个月的调整,你可以看到我正在做的事情。

答案 16 :(得分:-2)

它可以帮助某人

declare @dt uddt
select @dt=getdate()


select  case when month(@dt) between 1 and 3 then 'Q4' 
when month(@dt) between 4 and 6 then 'Q1'
when month(@dt) between 6 and 9 then 'Q2'
when month(@dt) between 9 and 12 then'Q3'
end as [Quarter] ,DATEADD(quarter, DATEDIFF(quarter, 0, @dt), 0) 
year_and_first_date_of_quarter,
DATEADD(d, -1, DATEADD(q,DATEDIFF(q, 0, @dt) + 1, 0)) 
year_and_last_date_of_quarter