Интервал Postgres не работает в подзапросе where

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть следующий код:

 Select * from table
where to_date <= ( select max(to_date)
                  FROM table)
  and to_date >= (select (max(to_date)::date - interval '6 months')::date as to_date
                  FROM table) 
  

В принципе, я пытаюсь просмотреть все результаты между максимальной датой и затем 6 месяцами в прошлом, и я попытался сделать это, выполнив 2 подзапроса.

Кажется, я получаю null, но, как ни странно, если добавить обычную дату, которая

 (select (max(to_date)::date - interval '6 months')::date
  

выдает и вставляет его как >='yyyy-mm-dd' , запрос, похоже, работает нормально. Это странно, поскольку оба подзапроса фактически выдают результаты формата даты и понятия не имеют, почему это происходит.

Комментарии:

1. Почему вы приводите значение во втором запросе к date , но не в первом?

2. Что вы имеете в виду под «не работает»?

Ответ №1:

Вам не нужны оба сравнения:

 select *
from table
where to_date >= (select (max(to_date)::date - interval '6 months')::date as to_date
                  from table
                 ) ;
  

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

Ответ №2:

Я не могу придумать причину, по которой это не сработало бы, но вы можете переписать запрос, чтобы запускать только один подзапрос, что также более эффективно:

 select t.*
from the_table t
  cross join (
    select max(the_date) as max_date
    from the_table
  ) mt
where t.to_date <= mt.max_date 
  and t.to_date >= mt.max_date - interval '6 months'
  

Комментарии:

1. Достаточно странно, что при предложенном вами подходе я получаю тот же нулевой результат (и нет, он не должен быть нулевым, у меня есть данные за 6 месяцев)

2. Это может быть только null , если таблица вообще не содержит строк.