Вы можете вычесть результаты двух подзапросов, каждый из которых получает минимальную дату из одной из таблиц; при общем выполнении запроса к dual
(встроенная однострочная таблица, которая весьма полезна для такого рода вещей):
-- CTEs for your sample data
with table_1 (logical_date) as (select date '2019-05-01' from dual),
table_2 (due_date) as (select date '2019-05-15' from dual)
-- actual query
select (select to_date(to_char(min(logical_date), 'YYYYMMDD'), 'YYYYMMDD') from table_1)
- (select to_date(to_char(min(due_date) ,'YYYYMMDD'),'YYYYMMDD') from table_2)
as diff
from dual;
DIFF
----------
-14
Но вам не нужно конвертировать в и из строк, вы можете просто сделать:
select (select min(logical_date) from table_1) - (select min(due_date) from table_2) as diff
from dual;
если в ваших датах нет компонентов, не относящихся к полуночи, в этом случае вы получите дробное число дней в вашем результате; чтобы получить только целые дни, либо округлите / усечите / пол / выведите результат, либо используйте trunc()
, чтобы установить оба компонента времени в полночь, прежде чем вычесть, что зависит от того, как вы хотите обработать эти дробные дни.
Если вы ожидаете, что эта разница будет -15, то вычтите одно из результата. Если вы ожидаете положительное значение, измените порядок подзапросов и добавьте вместо него.