PostgreSQL: выбор данных с отметкой «Нравится» - PullRequest
27 голосов
/ 26 января 2011

Я пытаюсь выбрать данные из таблицы, используя «как» в поле даты «date_checked» (отметка времени). Но у меня есть эта ошибка:

SQLSTATE[42883]: Undefined function: 7 ERROR:  operator does not exist: timestamp without time zone

Мой запрос:

SELECT my_table.id
FROM my_table
WHERE my_table.date_checker LIKE '2011-01-%'

Я не хочу использовать:

SELECT my_table.id
FROM my_table
WHERE my_table.date_checker >= '2011-01-01 00:00:00' 
    AND  my_table.date_checker < '2011-02-01 00:00:00'

Ответы [ 4 ]

69 голосов
/ 26 января 2011

Это очень хорошо - не «использовать» <и> с метками времени, но эти операторы могут быть преобразованы в сканирование индекса и совпадение строк ... ну, это возможно, но EWWWW.

Ну, ошибка происходит, потому что вам нужно явно преобразовать отметку времени в строку перед использованием над ней строковой операции, например:

date_checker::text LIKE '2011-01-%'

и I предположим, что вы можете затем создатьиндекс на (date_checker::text), и это выражение станет сканированием индекса, но .... EWWWW.

8 голосов
/ 26 января 2011

Возможно, функция date_trunc вам больше понравится:

... WHERE date_trunc('month', my_table.date_checker) = '2011-01-01'

При необходимости вы также можете поместить индекс в это выражение.

4 голосов
/ 26 января 2011

Если вам нужно провести сравнение какой-либо части timestamp, гораздо лучше использовать функцию EXTRACT().Например:

WHERE EXTRACT(YEAR FROM date_checker) = 2011
AND EXTRACT(MONTH FROM date_checker) = 1

Сведения о различных «полях», которые можно извлечь из даты, содержатся в документации .

2 голосов
/ 26 января 2011

Я не верю, что вы можете сделать like для столбца даты без предварительного преобразования его в строковое представление.

Вы можете использовать запрос между, чтобы выбрать между двумя датами, например:

SELECT id FROM my_table WHERE date_checker BETWEEN '2011-01-01' AND '2011-02-01';
...