Как выбрать между двумя конкретными Диапазонами дат

#sql #postgresql #date #between

Вопрос:

Скажем, мне нужен определенный интервал, например (мм/дд/гггг-1 — 1/1/гггг-1)

Как я мог запросить это в postgres?

До сих пор я разработал что-то вроде:

 SELECT * 
FROM my_table 
WHERE date BETWEEN (now()::DATE - INTERVAL '1 year') - ‘1/1/?’ AND (now() - INTERVAL '1 year') - ‘1/1/?’
 

Я не совсем уверен, как получить предыдущий год.

На правильном ли я пути? Извините, я новичок в этом деле. Спасибо!

Ответ №1:

Вы можете использовать date_trunc() , чтобы получить начало года:

 select *
from my_table
where date >= date_trunc('year', current_date - interval '1 year')
  and date  < date_trunc('year', current_date)
 

date_trunc('year', current_date) возвращается в первый день этого года. Как я использовал < в качестве верхней границы, это будет включать все даты до 31 декабря предыдущего года.

Если вы действительно хотите использовать BETWEEN (что будет работать правильно только в том случае, если date определено типом данных date ), вы можете использовать:

 select *
from my_table
where date between date_trunc('year', current_date - interval '1 year')::date
               and date_trunc('year', current_date)::date - 1
 

Обратите внимание, что верхний предел был приведен к а date , а затем я вычел 1 день, чтобы приземлиться 31 декабря. Это необходимо, потому что between включает в себя оба значения.

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

1. Привет, спасибо за ответ! Однако есть ли способ перефразировать запрос для использования МЕЖДУ… И..? И есть ли причина использовать date_trunc вместо «сейчас()::ИНТЕРВАЛ ДАТ ‘1 год'», чтобы получить мм/дд/гггг — 1 ?

2. Если вы имеете дело с метками времени, то в принципе всегда лучше использовать >= ... AND < , а не BETWEEN . Но если вы действительно хотите использовать между ними, см. Мою правку

Ответ №2:

Если вы хотите, вы можете использовать что-то вроде этого:

 select * from table 
 where data between to_date(concat('01/01/', EXTRACT (YEAR FROM now()) - 1), 'mm/dd/yyyy') and (now()::DATE - interval '1 year')
 

Но чем больше используется, тем date_trunc :

 select * from table
where date >= date_trunc('year', now()::DATE - interval '1 year')
  and date  < date_trunc('year', now()::DATE)
 

Когда вы используете date_trunc('year', now()::DATE) , день будет 01, месяц 01, а год будет в этом году.