#sql #postgresql #datetime
#sql #postgresql #дата-время
Вопрос:
В моем Postgresql есть поле datetime с именем «dt». Я хотел бы сделать что-то вроде
SELECT * FROM myTable WHERE extract (date from dt) = '01/01/11'
Какой правильный синтаксис для этого?
Спасибо!
Ответ №1:
Я думаю, вы хотите привести свой dt
к date
и исправить формат вашего литерала даты:
SELECT *
FROM table
WHERE dt::date = '2011-01-01' -- This should be ISO-8601 format, YYYY-MM-DD
Или стандартную версию:
SELECT *
FROM table
WHERE CAST(dt AS DATE) = '2011-01-01' -- This should be ISO-8601 format, YYYY-MM-DD
extract
Функция не понимает «дату» и возвращает число.
Комментарии:
1. Одно дополнение: если поле метки времени проиндексировано, использование dt::date или ПРИВЕДЕНИЕ (dt КАК дата) предотвращает использование индекса. Альтернативным методом было бы либо создать функциональный индекс на основе dt::date, либо записать его таким образом (используя параметр $ 1 в качестве строки даты): ГДЕ dt > = $ 1 И dt < $ 1 интервал ‘1 день’.
2. что бы ни говорил @MatthewWood, это всегда правильно 🙂
3. работает безупречно!
Ответ №2:
В PostgreSQL доступно несколько функций даты и времени, смотрите здесь.
В вашем примере вы могли бы использовать:
SELECT * FROM myTable WHERE date_trunc('day', dt) = 'YYYY-MM-DD';
Если вы регулярно выполняете этот запрос, также можно создать индекс, используя date_trunc
функцию:
CREATE INDEX date_trunc_dt_idx ON myTable ( date_trunc('day', dt) );
Одним из преимуществ этого является некоторая большая гибкость с часовыми поясами, если требуется, например:
CREATE INDEX date_trunc_dt_idx ON myTable ( date_trunc('day', dt at time zone 'Australia/Sydney') );
SELECT * FROM myTable WHERE date_trunc('day', dt at time zone 'Australia/Sydney') = 'YYYY-MM-DD';