Вот пример того, как вы можете сделать то, что показывает ответ по связанной статье.Обратите внимание, что у Oracle нет типа time
, только datetimes
, поэтому я не уверен, как вы храните свои часы.Я просто добавил их к датам начала / окончания для целей этого ответа.
WITH test_data AS (
SELECT 1 AS ID,
to_date('01/02/2018','dd/mm/yyyy') AS date_start,
to_date('15/02/2018','dd/mm/yyyy') AS date_end,
4 AS dayOfWeek,
to_date('08:00:00','hh24:mi:ss') AS time_start,
to_date('10:00:00','hh24:mi:ss') AS time_end,
'text1' AS field1
FROM dual
UNION
SELECT 2 AS ID,
to_date('01/06/2018','dd/mm/yyyy') AS date_start,
to_date('15/06/2018','dd/mm/yyyy') AS date_end,
2 AS dayOfWeek,
to_date('10:00:00','hh24:mi:ss') AS time_start,
to_date('13:00:00','hh24:mi:ss') AS time_end,
'text1' AS field1
FROM dual
), all_hours_in_range AS (
SELECT d.id,
LEVEL,
d.date_start,
d.date_end,
d.date_start + (LEVEL - 1) / 24 AS new_date,
d.dayOfWeek,
d.time_start,
d.time_end,
d.field1
FROM test_data d
CONNECT BY LEVEL <= (date_end - date_start) * 24 + 1
AND PRIOR ID = ID
AND PRIOR sys_guid() IS NOT NULL
)
SELECT to_char(a.new_date, 'dd/mm/yyyy') AS new_date,
to_char(a.new_date, 'hh24') AS new_hour,
a.field1
FROM all_hours_in_range a
WHERE to_char(a.new_date, 'hh24') >= to_char(a.time_start, 'hh24') /* Filter to results that are within specified hours */
AND to_char(a.new_date, 'hh24') <= to_char(a.time_end, 'hh24')
AND 1 + TRUNC (a.new_date) - TRUNC (a.new_date, 'IW') = a.dayOfWeek /* Filter to results that are on specified day of week */