Как задать интервал поиска по времени?

У меня есть дата и время, и есть вторая таблица, где дата одинаковая, но время может отличатся от 1 секунды до 30 минут вперед.

К примеру, есть искомая запись 2020-09-23 18:47:51, а во второй таблице она записана так 2020-09-23 18:48:01.

Как задать пределы поиска?

Так:

DATE_TIME + 1 / (24 * 60)

Или так:

DATE_TIME + interval '60' minute

Ответы (1 шт):

Автор решения: 0xdb

Дата и время может хранится в двух встроенных типах данных, для которых логические операции с разницей двух значений ожидают различные типы данных.

Более точный тип TIMESTAMP ожидает тип INTERVAL:

with t (ts1, ts2) as (
    select 
        timestamp'2020-09-23 18:47:51', timestamp'2020-09-23 18:48:01'
    from dual
)
select t.*, (ts2 - ts1) diff 
from t
where (ts2 - ts1) < interval '2' minute;

TS1                         TS2                         DIFF               
--------------------------- --------------------------- -------------------
23.09.20 18:47:51,000000000 23.09.20 18:48:01,000000000 +00 00:00:10.000000

Или более простой тип DATE, который ожидает числовое значение, где один день равен 1.
Во избежания "магических" и трудночитаемых чисел, принято конфигурировать их однострочным запросом:

with params as (
    select (1/24/60) minutes, (1/86400) seconds from dual),
d (dt1, dt2) as (
    select 
        cast('2020-09-23 18:47:51' as date), cast('2020-09-23 18:48:01'as date)
    from dual
)
select d.*, (dt2 - dt1) diff 
from d, params
where (dt2 - dt1) < 2*minutes + 0*seconds;

DT1                 DT2                       DIFF
------------------- ------------------- ----------
2020-09-23 18:47:51 2020-09-23 18:48:01 ,000115740741
→ Ссылка