Создать строки между двумя датами
У меня есть таблица ниже. Мне нужно создать строку для каждого месяца от hire_dt до term_dt
id hire_dt term_dt
1 08/07/2017 02/20/2018
Ожидаемые результаты:
id hire_dt term_dt Month level_alias
1 08/07/2017 10/20/2017 201708 1
1 08/07/2017 10/20/2017 201709 2
1 08/07/2017 10/20/2017 201710 3
Запрос:
SELECT DISTINCT
ID,
HIRE_DT,
TERM_DT,
TO_CHAR(ADD_MONTHS(TRUNC(HIRE_DT, 'MM'), LEVEL -1), 'YYYYMM') AS MONTH,
LEVEL AS LEVEL_ALIAS
FROM AHR
JOIN HA ON ID = HA.id --AND RNK = 1
WHERE 1=1
CONNECT BY LEVEL <= 1 + MONTHS_BETWEEN(TRUNC(TERM_DT,'MM'),TRUNC(HIRE_DT,'MM'))
AND PRIOR ID = ID AND PRIOR HIRE_DT=HIRE_DT
AND PRIOR SYS_GUID() IS NOT NULL
AND AHR.ASSOC_AIN_ID = 1
Результаты:
id hire_dt term_dt Month level_alias
1 08/07/2017 201708 1
1 08/07/2017 10/20/2017 201708 1
1 08/07/2017 10/20/2017 201709 2
1 08/07/2017 10/20/2017 201710 3
Почему я получаю нулевое значение term_dt?
1 ответ
На основе предоставленных вами (несколько вводящих в заблуждение; 20.10.2017 и 20.02.2017) примеров данных, посмотрите на это:
SQL> with test (id, hire_dt, term_dt) as
2 (select 1, date '2017-08-07', date '2017-10-20' from dual)
3 select id,
4 hire_dt,
5 term_dt,
6 to_char(add_months(hire_dt, level - 1), 'yyyymm') month,
7 level lvl
8 from test
9 connect by level <= months_between(term_dt, hire_dt) + 1;
ID HIRE_DT TERM_DT MONTH LVL
---------- ---------- ---------- ------ ----------
1 08/07/2017 10/20/2017 201708 1
1 08/07/2017 10/20/2017 201709 2
1 08/07/2017 10/20/2017 201710 3
SQL>
Возможно, его нужно изменить, но, как я уже сказал, с предоставленной вами информацией, это все (т.е. я не знаю, к каким таблицам вы присоединяетесь и почему).