Сравните даты из двух запросов PL/SQL

У меня есть два запроса, первый возвращает некоторые данные из моей таблицы, второй запрос отображает все полчаса времени между двумя указанными датами. Есть ли способ сравнить результаты даты из запроса 1 из запроса 2 и объединить два результата вместе, когда дата из запроса 2 не существует в результате запроса 1.

Я прикреплю небольшую диаграмму, чтобы показать, что я имею в виду.

Запрос 1:

SELECT 
reading_date, 
reading_value    
FROM DCM_READING
WHERE reading_date BETWEEN TO_DATE('17-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS')
AND  TO_DATE('19-NOV-2019'   || ' 235959', 'DD-MON-YYYY HH24MISS')
ORDER BY reading_date; 

Запрос 2:

  select TO_DATE('17-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS') + 
         ( level / 48 ) dt
from   dual
connect by level <= ( 48 + ( 48 * 
    (  TO_DATE('19-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS') - 
         TO_DATE('17-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS') )
  ) 
) ;

Все слышали об ошибке Y2k? Я не знаю, является ли «18 ноября 19» 18 ноября 2019 года или 19 ноября 2018 года. Хорошо, я могу сделать вывод из вашего фактического кода, но тогда это просто подчеркивает тот факт, что ваши даты хранятся в виде строк, а не ДАТЫ. Еще один конструктивный недостаток.

EdStevens 18.12.2020 17:09
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
425
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете перечислить временные метки, которые вы хотите в CTE, а затем принести таблицу с left join:

with cte (reading_date) as (
    select date '2020-11-17' from dual
    union all
    select reading_date + interval '30' minute 
    from cte 
    where reading_date + interval '30' minute < date '2020-11-19'
)
select c.reading_date, d.reading_value
from cte c
left join dcm_reading d on d.reading_date = c.reading_date
order by c.reading_date

Мне нравится использовать рекурсивные запросы, а не специфичный для Oracle синтаксис connect by, потому что они являются стандартным SQL, но это в основном дело вкуса, логика остается прежней.

Это определенно больше похоже на то, что у меня было в голове - только все значения для всех периодов времени равны NULL, т.е. - d.reading_value не сохраняется в конечном результате.

elszeus 18.12.2020 16:49

@elszeus: это означало бы, что в dcm_reading нет данных для дат, сгенерированных cte.

GMB 18.12.2020 16:57

Да, ты прав - я поставил неправильную дату!! и спасибо также, я не знал, что подключение может достичь того же!

elszeus 18.12.2020 17:00

Другие вопросы по теме