Oracle TRUNC每季度一次但自定义年份开始日期

我需要每季度获取一次聚合值,可以使用带有'Q'选项的trunc函数来完成

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日,而不是1 - 2015年1月至2015年3月31日)。 补充:因此Q1包括12月,1月,2月; Q2包括3月,4月,5月; Q3包括6月,7月,8月; 第四季度包括9月,10月,11月

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


在我看来你有几个问题在这里。

1)要将12月的日期推入本地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);

“我需要在去年的12月1日开始,而不是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函数。 了解更多。


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

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

使用ADD_MONTHS 更新 @ APC的解决方案比使用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');
链接地址: http://www.djcxy.com/p/65611.html

上一篇: Oracle TRUNC date by quarter but with custom year start date

下一篇: Comparing Dates in a specific format in SQL Server