Подтвердить что ты не робот

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'
4b9b3361

Ответ 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-%';