SELECT * FROM birthdays
WHERE extract( 'mon' from birthday ) = 3;
В этой команде в вызове функции extract имеет место неявное приведение
типов, т. к. ее вторым параметром должно быть значение типа timestamp. По-
лагаться на неявное приведение типов можно не всегда.
person
| birthday
--------------+------------
Ken Thompson | 1955-03-23
Ben Johnson | 1971-03-19
(2 строки)
88
Контрольные вопросы и задания
Если нам потребуется выяснить, кто из этих людей достиг возраста, скажем,
40 лет на момент выполнения запроса, то команда может быть такой (в послед-
нем столбце показана дата достижения возраста 40 лет):
SELECT *, birthday + '40 years'::interval
FROM birthdays
WHERE birthday + '40 years'::interval < current_timestamp;
person
| birthday |
?column?
--------------+------------+---------------------
Ken Thompson | 1955-03-23 | 1995-03-23 00:00:00
Ben Johnson | 1971-03-19 | 2011-03-19 00:00:00
(2 строки)
Можно заменить current_timestamp на current_date:
SELECT *, birthday + '40 years'::interval
FROM birthdays
WHERE birthday + '40 years'::interval < current_date;
А вот если мы захотим определить точный возраст каждого человека на теку-
щий момент времени, то как получить этот результат?
Первый вариант таков:
SELECT *, ( current_date::timestamp - birthday::timestamp )::interval
FROM birthdays;
person
| birthday | interval
--------------+------------+------------
Ken Thompson | 1955-03-23 | 22477 days
Ben Johnson | 1971-03-19 | 16637 days
Andy Gibson | 1987-08-12 | 10647 days
(3 строки)
Этот вариант не дает результата, представленного в удобной форме: он показы-
вает возраст в днях, а для пересчета числа дней в число лет нужны дополнитель-
ные действия. Хотя, наверное, возможны ситуации, когда требуется определить
возраст именно в днях.
В PostgreSQL предусмотрена специальная функция, позволяющая решить нашу
задачу простым способом. Самостоятельно найдите ее описание в документа-
ции (см. раздел 9.9 «Операторы и функции даты/времени») и напишите команду
с ее использованием.
89
|