Вопрос:
Я нахожу сайт учебника postgres https://www.postgresql.org/docs/9.3/static/functions-datetime.html Мне нужна помощь с возрастной функцией, и я не уверен, как ее использовать. У меня есть столбец в таблице учеников, названный дата рождения. Мне нужно найти студентов в возрасте старше 12 лет.
select ……, age(timestamp ‘birthdate’) as StudentAge from students ….. where StudentAge > 11
Я не знаю, соответствует ли это правильному синтаксису или если im использует правильную функцию для ситуации
Лучший ответ:
Я думаю, что большая часть вашей путаницы связана с незнанием системы Postgres rich type и синтаксиса, который она использует.
На странице функций даты/времени функция age указана в двух формах. Предполагая, что вы хотите сравнить с “сегодня”, вам нужна форма с одним аргументом:
Функция: возраст (временная метка)
Тип возврата: интервал
Описание: Вычитание из current_date (в полночь)
Пример: возраст (timestamp ‘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’.
Ответ №1
Я не знаю этого учебника, о котором вы говорите, но в документации есть следующие слова о столбцах:
Записи в списке выбора могут быть назначены имена для последующей обработки, например, для использования в предложении ORDER BY или для отображения клиентским приложением.
Обратите внимание на следующее: Список SELECT (логически) обрабатывается после WHERE, поэтому вы не можете использовать метки столбцов.
Вам придется повторить это выражение. Это соответствует стандарту SQL.
Кроме того, birthdate не является строковым литералом, поэтому не цитируйте ее. И удалите timestamp.