понедельник, 26 января 2009 г.

Изменения при работе с timestamp в PostgreSQL 8.3

После очередного обновления версий на сервере с PostgreSQL обнаружлось, что старые конструкции для работы с timestamp-полями не срабатывают.
Например, имеем таблицу:

CREATE TABLE logs (
l_id bigint DEFAULT nextval('logs_seq'::regclass) NOT NULL,
l_date timestamp without time zone,
);
Хотим из неё что-то:
select count(l_id) from logs where l_date like '%2009-01-01%'
Получаем ответ в виде:
ERROR: operator does not exist: timestamp without time zone ~~ unknown at character 43
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Из официального источника удалось узнать что c версии 8.3 отсутствует автоматическоге приведение типа timestamp к строке. Решение изложено там же. Хотеть чего-то от таблицы в такой ситуации имеет смысл следующим образом:
select count(l_id) from logs where date_trunc('day', l_date) = '2009-01-01'
Функция date_trunc позволяет представлять данные из поля timestamp с определенной точностью. В данном случае точность указывается до дня. В документации представлен объемный список параметров функции date_trunc для обеспечения метке времени той или иной точности:
  • microseconds
  • milliseconds
  • second
  • minute
  • hour
  • day
  • week
  • month
  • quarter
  • year
  • decade
  • century
  • millennium
Последнее значение из списка особенно актуально...