Создать строки между двумя датами - PullRequest
0 голосов
/ 23 октября 2018

У меня есть таблица ниже.Мне нужно создать строку для каждого месяца от 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 Ответ

0 голосов
/ 23 октября 2018

Основываясь на предоставленных вами образцах данных (несколько вводящих в заблуждение; 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>

Это может нужно изменить, но - как я уже сказал, с предоставленной вами информацией, вот и все (т.е. я понятия не имею, к каким таблицам вы присоединяетесь и почему).

...