to_char()
предназначен для форматирования дат. Для такого условия, как ваше, extract()
проще и быстрее:
SELECT *
FROM people
WHERE extract(month FROM dob) = 7;
Если вы хотите найти
конкретный год и месяц (ГГГГ-ММ)
... как упоминалось в комментарии, используйте date_trunc()
, как и вначале. Просто сравните его с date
или timestamp
, а не со строкой, что не имело бы никакого смысла (и было причиной сообщения об ошибке). Чтобы найти людей, родившихся в июле 1970 года:
SELECT *
FROM people
WHERE date_trunc('month', dob) = '1970-07-01 0:0'::timestamp;
Если производительность важна, перепишите это так:
SELECT *
FROM people
WHERE dob >= '1970-07-01 0:0'::timestamp
AND dob < '1970-08-01 0:0'::timestamp; -- note the < with the upper limit
Поскольку эта форма может использовать простой индекс для people.dob
:
CREATE INDEX people_dob_idx ON people (dob);
... и, следовательно, снизит производительность предыдущих запросов с большими таблицами. С маленькими столиками особого значения не имеет.
Вы также можете ускорить первый запрос с помощью функционального индекса, если нужно.
person
Erwin Brandstetter
schedule
29.09.2012