甲骨文 - 将日期分成四分之一

时间:2011-09-26 16:57:39

标签: sql oracle plsql

给定2个日期(StartDate和EndDate),如何在Pl / SQL中生成季度周期。

示例:

Start Date: 01-JAN-2009
End Date: 31-DEC-2009

预期产出:

StartDate        EndDate
01-JAN-2009      31-MAR-2009
01-APR-2009      30-JUN-2009
01-JUL-2009      30-SEP-2009
01-OCT-2009      31-DEC-2009

2 个答案:

答案 0 :(得分:3)

SELECT  ADD_MONTHS( TRUNC(PARAM.start_date, 'Q'), 3*(LEVEL-1) )   AS qstart
    ,   ADD_MONTHS( TRUNC(PARAM.start_date, 'Q'), 3*(LEVEL) ) -1  AS qend
FROM    (   SELECT  TO_DATE('&start_date')  AS start_date
                ,   TO_DATE('&end_date')    AS end_date
            FROM    DUAL
        ) PARAM
CONNECT BY ADD_MONTHS( TRUNC(PARAM.start_date, 'Q'), 3*(LEVEL) ) -1
        <= PARAM.end_date

参数规则,您可能需要调整查询以满足您的目的:

  • 如果start_date不是精确的季度开始,则它会有效地使用该季度包含开始日期。
  • 如果end_date不是精确的季度结束,那么我们会在结束于end_date之前的季度结束(而不是包含结束日期的季度)。

答案 1 :(得分:0)

这是使用PL / SQL

执行此操作的一种方法
declare
  startDate Date := '01-JAN-2009';
  endDate   Date := '31-DEC-2009';
  totalQuarters number := 0;

begin

  totalQuarters := round(months_between(endDate, startDate),0)/3;

  dbms_output.put_line ('total quarters: ' || totalQuarters);
  for i in 1..totalQuarters loop

    dbms_output.put_line('start date: '|| startDate || ' end date:' ||    add_months(startDate -1,3));
    startDate := add_months(startDate,3) ;
   end loop;

end;