代码之家  ›  专栏  ›  技术社区  ›  goabk

按季度列出Oracle TRUNC日期,但带有自定义年份开始日期

  •  -1
  • goabk  · 技术社区  · 10 年前

    我需要每季度获取一次聚合值,这可以使用trunc函数和选项“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日)。 补充:因此第一季度包括12月、1月和2月;第二季度包括3月、4月和5月;第三季度包括6月、7月和8月;第四季度包括9月、10月和11月

    PS:我使用的是Oracle11g,我将通过PHP5.3运行这些查询。

    3 回复  |  直到 10 年前
        1
  •  4
  •   APC    10 年前

    “我需要从上一年的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函数。 Find out more .

        2
  •  0
  •   Michael Broughton    10 年前

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

    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);
    
        3
  •  0
  •   Community CDub    7 年前

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

    要获得2014年12月1日而不是2015年1月1日的当前季度,您可以从本季度向后移动一天,然后获得当月的第一天。

    使现代化 @APC's solution 使用 添加月份(_M) 比我用的更好更整洁 截断 两次我建议使用他的解决方案。我的可能是另一种选择,很高兴知道。

    例如

    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');