Как написать SQL запрос с условием разницы дат не более некоторого количества месяцев?

Есть таблица с двумя полями дат, одна из них часто не определена и я использовал nvl.

Проблема возникла с условием разницы дат, не более некоторого количества месяцев.

Я накидал, что-то вроде этого:

SELECT 
  NVL(table.change_date, table.start_date) real_date
, MONTHS_BETWEEN(TRUNC(CURRENT_DATE, 'MONTH'), TRUNC(real_date, 'MONTH')) razn
FROM  table
WHERE (MONTHS_BETWEEN(
  TRUNC(CURRENT_DATE, 'MONTH'), 
  TRUNC(NVL(table.dpm_change_date, table.dpm_start_date))) < 15

Подскажите, где и как правильно прописать?


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

Автор решения: teamer

в select-листе нельзя использовать алиасы полей, определённые в этом же листе.

замените

TRUNC(real_date, 'MONTH'))

на

TRUNC(NVL(table.change_date,table.start_date),'MONTH')

а также приведите в соответствие открывающие и закрывающие скобки в кляузе WHERE, и, если вы не ошиблись с именами полей в WHERE, у вас всё получится.

→ Ссылка
Автор решения: 0xdb

Для записей за 2020 год:

create table t (id, created, modified) as
    select rownum, add_months (date'2020-01-01', rownum-1), cast (null as date)
    from dual connect by level<=12

Ожидаю, что для условия - не более 15 месяцев с 01.12.2021, получу записи с октября по декабрь:

select t.id, coalesce (modified, created) lastchanged
from t
where months_between (date'2021-12-01', coalesce (modified, created)) < 15

Так и есть (на db<>fiddle):

        ID LASTCHANGED        
---------- -------------------
        10 2020-10-01 00:00:00
        11 2020-11-01 00:00:00
        12 2020-12-01 00:00:00
→ Ссылка