Oracle - разбить даты на кварталы
Учитывая 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 ответа
Решение
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 не является точным концом квартала, то мы заканчиваем квартал, который закончился ДО конца__даты (не тот, который содержит дату окончания).
Вот один из способов, которым вы можете сделать это с 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;