PostgreSQL: выберите данные с похожими полями timestamp
Я пытаюсь выбрать данные из таблицы, используя "как" в поле даты "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'
Ответы
Ответ 1
Все это очень хорошо не "хочет использовать" < и > с метками времени, но эти операторы могут быть преобразованы в сканирование индексов и совпадение строк... ну, это возможно, но EWWWW.
Ну, ошибка возникает, потому что вам нужно явно преобразовать метку времени в строку перед использованием строковой операции на ней, например:
date_checker::text LIKE '2011-01-%'
и я полагаю, вы могли бы создать индекс на (date_checker::text)
, и это выражение станет сканированием индекса, но.... EWWWW.
Ответ 2
Возможно, функция date_trunc
будет больше по душе:
... WHERE date_trunc('month', my_table.date_checker) = '2011-01-01'
Вы также можете поместить индекс в это выражение, если это необходимо.
Ответ 3
Если вам нужно выполнить сравнение с некоторой частью timestamp
, гораздо лучше использовать функцию EXTRACT()
. Например:
WHERE EXTRACT(YEAR FROM date_checker) = 2011
AND EXTRACT(MONTH FROM date_checker) = 1
Подробности различных полей, которые вы можете извлечь из даты, находятся в документации.
Ответ 4
Я не верю, что вы можете сделать like
в столбце даты, не переведя его сначала в строковое представление.
Вы можете использовать промежуточный запрос для выбора между двумя датами, например:
SELECT id FROM my_table WHERE date_checker BETWEEN '2011-01-01' AND '2011-02-01';
Ответ 5
Попробуйте это:
SELECT my_table.id
FROM my_table
WHERE CAST(my_table.date_checker AS VARCHAR) LIKE '2011-01-%';