Postgresql — выберите что-нибудь, где date = «01/01/11»

#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';