#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, а год будет в этом году.