psql 8.4.1 выберите всех людей, родившихся в конкретный месяц

Я должен выбрать всех людей, родившихся в июле (или 07). Это не сработало:

select * from people where date_trunc('month',dob)='07';

ОШИБКА: недопустимый синтаксис ввода для временной метки типа с часовым поясом: «07» СТРОКА 1: ... ct * от людей, где date_trunc ('month', dob) = '07';

Каков правильный путь?


person mamesaye    schedule 20.09.2012    source источник


Ответы (2)


select * from people where to_char(dob, 'MM') = '09';

дает вам всех людей, которые родились в сентябре, если дата рождения хранится в столбце таблицы временных меток под названием «dob». Второй параметр - шаблон формата даты. Все типовые шаблоны должны поддерживаться. Например.:

select * from people where to_char(dob, 'MON') = 'SEP'; 

сделал бы то же самое.

формат временной метки см. здесь шаблоны в Postgres:

person Kai Huppmann    schedule 21.09.2012
comment
хорошая ссылка.Мне удалось найти людей, родившихся в определенный год и месяц (ГГГГ-ММ). - person mamesaye; 21.09.2012
comment
@mamesaye: Ссылка была на руководство устаревшей версии 8.2. Изменен, чтобы указывать на версию 8.4. - person Erwin Brandstetter; 29.09.2012

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