Выберите дату передачи всех записей как 20 января — PSQL

#sql #postgresql

Вопрос:

Я хотел бы иметь возможность запрашивать записи из моей таблицы , передавая их в January 20 January 21 качестве примера

Я обнаружил, что этот EXTRACT метод можно использовать для подобных случаев, но как я мог бы использовать его при указании месяца и года. Нужно ли мне форматировать строку, которую я предоставляю, в дату?

 SELECT * FROM myTable WHERE EXTRACT(MONTH FROM kick_off) = 'January 20';
 

Спасибо

Ответ №1:

Вам нужно использовать два вызова извлечения, и поскольку extract() возвращает номер, вы не можете сравнить его с January :

 SELECT * 
FROM myTable 
WHERE EXTRACT(MONTH FROM kick_off) = 1
  and EXTRACT(year FROM kick_off) = 2020;
 

Если у вас есть индекс в kick_off приведенном выше запросе, не используйте этот индекс. Обычно более эффективно использовать запрос диапазона:

 SELECT * 
FROM myTable 
WHERE kick_off >= date '2020-01-01'
  and kick_off  < date '2020-02-01'
 

Комментарии:

1. Немного задержался с ответом вам после того, как вы ответили @a_horse_with_no_name, спасибо, два вызова извлечения сработали для моего конкретного сценария

Ответ №2:

Вы можете сделать это, используя to_char в столбце kick_off, но это действительно плохой дизайн:

 SELECT *
FROM myTable
WHERE to_char(kick_off, 'FMMonth YY') = 'January 20'
 

Однако, как прямо указал @a_horse_with_no_name_correctly, это, скорее всего, плохая идея, потому что такой запрос не будет использовать индекс в столбце kick_off, поэтому фильтр диапазона дат предпочтительнее, так как он будет работать намного лучше при наличии индекса.

Кроме того, поведение формата «FMMonth» зависит от локали (соответствующая документация здесь: https://www.postgresql.org/docs/current/functions-formatting.html).