我正在尝试构建一个查询,该查询将映射两个列,一个是表格中的日期,第二列是别名,以显示日期所属的季度和财政年度。
不幸的是,我没有足够的SQL知识来知道从哪里开始。我知道我会使用getdate()
和dateadd(MONTH,,)
的组合执行此操作,但是我所放在一起的任何内容都已接近工作。
为了进一步复杂化,澳大利亚的财政年度将从7月1日至6月30日开始,因此2012财年第一季度将从2012年7月1日开始。
我可以在没有声明的情况下执行此操作,但是我更愿意在声明中使用它,因为它将用于SSRS报告和C#应用程序,它将使维护变得更加容易。
答案 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 int
和FiscalQuarter 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