Запрос Postgresql между диапазонами дат
Я пытаюсь запросить мою БД postgresql, чтобы вернуть результаты, где дата находится в определенном месяце и Году. Другими словами, Я хотел бы получить все значения за месяц-год.
единственный способ, которым я смог сделать это до сих пор, таков:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN '2014-02-01' AND '2014-02-28'
проблема в том, что я должен вычислить первую дату и последнюю дату перед запросом таблицы. Есть ли более простой способ сделать это?
спасибо
4 ответов
С даты (и время) многие вещи становятся проще, если вы используете >= start AND < end
.
например:
SELECT
user_id
FROM
user_logs
WHERE
login_date >= '2014-02-01'
AND login_date < '2014-03-01'
в этом случае вам все равно нужно рассчитать дату начала месяца, который вам нужен, Но это должно быть прямо вперед любым количеством способов.
дата окончания также упрощена; просто добавьте ровно один месяц. Не связывайтесь с 28-м, 30-м, 31-м и т. д.
эта структура также имеет преимущество мочь к поддерживать использование индексов.
многие люди могут предложить такую форму, как следующая, но они не использовать индексы:
WHERE
DATEPART('year', login_date) = 2014
AND DATEPART('month', login_date) = 2
Это включает в себя вычисление условий для каждой строки в таблице (сканирование) и не использовать индекс, чтобы найти диапазон строк, которые будут соответствовать (диапазон поиска).
Из PostreSQL 9.2 Типа поддерживаются. Поэтому вы можете написать это так:
SELECT user_id
FROM user_logs
WHERE '[2014-02-01, 2014-03-01]'::daterange @> login_date
это должно быть более эффективным, чем сравнение строк
на случай, если кто-то приземлится здесь... с 8.1 вы можете просто использовать:
SELECT user_id
FROM user_logs
WHERE login_date BETWEEN SYMMETRIC '2014-02-01' AND '2014-02-28'
документы:
между симметричными такая же, как между разве нет требование, чтобы аргумент слева и был меньше или равен к аргументу справа. Если это не так, эти два аргумента автоматически заменяется, так что непустой диапазон всегда подразумевается.
читать документацию.
http://www.postgresql.org/docs/9.1/static/functions-datetime.html
я использовал такой запрос:
WHERE
(
date_trunc('day',table1.date_eval) = '2015-02-09'
)
или
WHERE(date_trunc('day',table1.date_eval) >='2015-02-09'AND date_trunc('day',table1.date_eval) <'2015-02-09')
Juanitos Ingenier.