Я думаю, что большая часть вашей путаницы происходит из-за незнания системы Postgres и ее синтаксиса.
На странице с функциями даты / времени функция age
указана в двух формах. Предполагая, что вы хотите сравнить с «сегодня», вы хотите форму с одним аргументом:
Функция: возраст (временная метка)
Тип возврата: интервал
Описание: Вычесть из текущей даты (в полночь)
Пример: age (метка времени '1957-06-13')
Результат: 43 года 8 мес 3 дня
Итак, у вас есть функция, которая принимает значение типа timestamp
и возвращает значение типа interval
.
В примере показано, что вход указан как timestamp '1957-06-13'
; это просто способ создания значения типа timestamp
из жестко запрограммированного значения - например, создание объекта на объектно-ориентированном языке. В вашем запросе birthdate
не является жестко запрограммированным значением, это имя столбца, так что это не тот синтаксис, который вам нужен. Если столбец имеет тип timestamp
, вы можете просто использовать age(birthdate)
напрямую; если нет, вам может потребоваться преобразовать его, например, age(CAST(birthdate AS timestamp))
.
Вывод имеет тип interval
, а не число лет, поэтому сравнение его с 12
вряд ли даст то, что вы хотите. Вместо этого вы должны сравнить его с другим значением interval
. Как и в примере timestamp '1957-06-13'
, вы можете написать interval '12 years'
, чтобы напрямую создать значение interval
, представляющее 12 лет.
Итак, ваше сравнение будет выглядеть так: age(birthdate) >= interval '12 years'
.