Oracle TRUNC按季度开放,但具有自定义年份开始日期

时间:2015-03-11 07:19:10

标签: sql oracle date-arithmetic

我需要按季度获得聚合值,这可以使用截断函数和选项'Q'来完成,如此

select count(*), trunc(DATE_COL, 'Q') from TABLE_NAME
group by trunc(DATE_COL, 'Q')

但问题在于我需要在去年12月1日而不是1月1日开始这一年(例如:2015年第一季度开始于2014年12月1日,结束于2015年2月28日,反对2015年1月1日至2015年3月31日)。 补充:所以Q1包括Dec,Jan,Feb; Q2包括3月,4月,5月; Q3包括Jun,Jul,Aug;第四季度包括9月,10月,11月

PS:我正在使用Oracle 11g,我将通过PHP 5.3运行这些查询。

3 个答案:

答案 0 :(得分:4)

  

“我需要在上一年的12月而不是1月1日开始这一年(例如:2015年第一季度开始于2014年12月1日,结束于2015年2月28日”

好的,所以你想把所有的宿舍都搬回一个月。这很简单:使用带负数的ADD_MONTHS()减去一个月....

select count(*), add_months(trunc(DATE_COL, 'Q'), -1) Q
from TABLE_NAME
group by add_months(trunc(DATE_COL, 'Q'), -1)

ADD_MONTHS()是标准的Oracle功能。 Find out more

答案 1 :(得分:0)

  

我需要从去年12月1日开始而不是1月1日开始(例如:2015年第一季度开始于2014年12月1日

要获得1-DEC-2014而不是当前季度的1-JAN-2015,您可以从本季度开始返回一天,然后获得该月的第一天。

使用 ADD_MONTHS

更新 @APC's solution比使用 TRUNC 两次更好,更整洁。我建议使用他的解决方案。我可以作为另一种选择,只需要知道。

例如,

SQL> SELECT trunc(trunc(SYSDATE, 'Q') - 1, 'month') Q1 FROM dual;

Q1
---------
01-DEC-14

SQL>

尝试,

SELECT COUNT(*),
  TRUNC(TRUNC(DATE_COL, 'Q') - 1, 'month') Q1
FROM TABLE_NAME
GROUP BY TRUNC(TRUNC(DATE_COL, 'Q') - 1, 'month');

答案 2 :(得分:0)

在我看来,你有几个问题。

1)要将日期从十二月推送到本机Q1包,请使用add_months(:date,1)。这可以将您的所有内容移动到Oracle的Q1,2,3,4中,以便轻松聚合。

2)标签。如果您需要查询来进行动态标记,那么APC和Lalit可以帮您找到正确的开始日期。从那里,last_day(add_months(Quarter_start_date,3))会得到另一个端点!

3)好的,那么你是否正在寻找每季度一行的回报?或者每年一行,四个季度作为列?如果每季度一行,您需要确保在没有数据的情况下返回一行吗?

但要按季度进行一个简单的汇总与您的一个月抵消:

SELECT count(*)
     , add_months(trunc(add_months(your_date_field,1),'Q'),-1) q_start_date
FROM YOUR_TABLE
GROUP BY  add_months(trunc(add_months(your_date_field,1),'Q'),-1);