как использовать функцию age () в postgresql - PullRequest
0 голосов
/ 05 июля 2018

Я нахожу учебный сайт postgres https://www.postgresql.org/docs/9.3/static/functions-datetime.html Мне нужна помощь с функцией age, и я не уверен, как ее использовать. У меня есть колонка в таблице студентов, которая называется дата рождения. мне нужно найти студентов старше 12 лет.

select ......, age(timestamp 'birthdate') as StudentAge
from students
.....
where StudentAge > 11

Я не знаю, правильный ли это синтаксис или я использую правильную функцию для ситуации

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я не знаю, о каком учебнике вы говорите, но в документации есть следующее, что можно сказать о метках столбцов:

Для записей в списке выбора могут быть назначены имена для последующей обработки, например, для использования в предложении ORDER BY или для отображения клиентским приложением.

Обратите внимание на следующие здесь: список SELECT (логически) обрабатывается после предложения WHERE, поэтому вы не можете использовать там метки столбцов.

Вам придется повторить выражение. Это соответствует стандарту SQL.

Более того, birthdate не является строковым литералом, поэтому не заключайте его в кавычки. И удалите timestamp.

0 голосов
/ 05 июля 2018

Я думаю, что большая часть вашей путаницы происходит из-за незнания системы 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'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...