#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).