Я думаю, что это должно сделать это:
SELECT e.employee_id,
date(extract(year from startdate)||'-'||mm.month_nr||'-'||extract(day from startdate)) as stardate,
first_value(e.enddate) over (partition by employee_id order by e.enddate) as enddate
FROM (
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)
) mm (month_nr)
JOIN emp_test e
ON mm.month_nr = extract(month from e.startdate)
ORDER BY e.employee_id,
e.startdate,
e.enddate
Это, конечно, предполагает, что тип данных для начальной и конечной даты равен DATE
.
И это будет работать, только если все даты в течение одного года.
Я тестировал это только с DB2 9.7, но думаю, что он также должен работать с 9.5.
Я думаю, что есть решение для годовой проблемы:
WITH yrs (year_month) AS
(
SELECT DATE(year_nr||'-'||month_nr||'-16')
FROM (
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)
) mon (month_nr)
CROSS JOIN (
VALUES (2007), (2008), (2009), (2010), (2011), (2012), (2013)
) yr (year_nr)
)
SELECT e.employee_id,
yrs.year_month as startdate,
first_value(e.enddate) over (partition by employee_id order by e.enddate) as enddate
FROM emp_test e
JOIN yrs ON yrs.year_month between e.startdate and e.enddate
Как видите, годы "жестко закодированы" в CTE (общее табличное выражение). Самым простым решением было бы создать таблицу «месяц / год», содержащую все возможные значения - в основном данные, которые генерирует CTE.