#sql #postgresql #datetime #where-clause #sql-like
#sql #postgresql #дата и время #where-предложение #sql-подобный
Вопрос:
Я хочу получить продажи с датой, которая начиналась с ‘2007-02’:
SELECT *
FROM payment
WHERE payment_date LIKE '2007%';
Но есть ошибка:
ERROR: ERROR: operator does not exist: timestamp without time zone ~~ unknown
LINE 9: WHERE payment_date LIKE '2007%'
^
HINT: Operator with given name and argument types could not be found. Perhaps you should add explicit casts.
Но другой запрос как
SELECT email
FROM customer
WHERE first_name = 'Kelly'
AND last_name LIKE 'K%';
работайте правильно. Как я могу заставить этот запрос работать?
Вы можете получить мою обучающую базу данных по ссылке: https://dropmefiles.com/LX8cu
Ответ №1:
Я хочу получить продажи с датой, которая начиналась с ‘2007-02’:
LIKE
является строковой функцией. Как указывает сообщение об ошибке, payment_date
столбец имеет timestamp
тип данных, поэтому используйте фильтрацию по дате:
where payment_date >= date '2007-02-01' and payment_date < date '2017-03-01'
Или, если вы хотите весь год:
where payment_date >= date '2007-01-01' and payment_date < date '2018-01-01'
У вас может возникнуть соблазн использовать функцию даты для извлечения части года даты и использовать ее для сравнения:
where extract(year from payment_date) = 2007
Я бы не рекомендовал этого; это гораздо менее эффективно, потому что функция должна быть применена ко всему столбцу, прежде чем может произойти фильтрация, в отличие от прямой фильтрации по литералам. Один говорит, что выражение не является саргируемым.
Ответ №2:
Сообщение об ошибке действительно говорит само за себя — like
оператор принимает строки с обеих сторон, в то время как у вас есть временная метка.
Альтернативным подходом может быть extract
год:
SELECT *
FROM payment
WHERE EXTRACT(YEAR FROM payment_date) = 2007;
Ответ №3:
Я предполагаю, что ваше поле payment_date имеет тип date, time или timestamp .
Попробуйте преобразовать дату / время в строку перед использованием оператора like .
https://www.postgresql.org/docs/13/functions-formatting.html