ПОДОБНЫЙ PostgreSQL запрос

#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