2011-09-26 125 views
3

给定2个日期(StartDate和EndDate),我如何在Pl/SQL中生成季度期间。Oracle - 将日期分为几个季度

例子:

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 

回答

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 

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

  • 如果开始不是确切的季度开始它有效地使用季度contai开始日期。
  • 如果end_date不是确切的四分之一结束,那么我们在end_date(不包含结束日期的那一个)结束的那个季度结束。
+0

酷做这件事。这工作正常。我可以根据我得到的BR进行更改。非常感谢。 – Asdfg

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;