postgresql возраст по дате рождения

как использовать функцию age() в postgresql

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

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

Я думаю, что большая часть вашей путаницы связана с незнанием системы Postgres rich type и синтаксиса, который она использует.

На странице функций даты/времени функция age указана в двух формах. Предполагая, что вы хотите сравнить с “сегодня”, вам нужна форма с одним аргументом:

Функция: возраст (временная метка)
Тип возврата: интервал
Описание: Вычитание из current_date (в полночь)
Пример: возраст (timestamp ‘1957-06-13’)
Результат: 43 года 8 месяцев 3 дня

Таким образом, у вас есть функция, которая принимает значение типа timestamp и возвращает значение interval типа.

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

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

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

Источник

PostgreSQL — ДАТА / ВРЕМЯ Функции и операторы

В следующей таблице перечислены поведения основных арифметических операторов —

Ниже приведен список всех важных функций, связанных с датой и временем.

С. Нет.Описание функции
1ВОЗРАСТ()

Текущая дата и время

Получить подполе (эквивалентное извлечению)

Тест на конечную дату, время и интервал (не +/- бесконечность)

Текущая дата и время

Получить подполе (эквивалентное извлечению)

Тест на конечную дату, время и интервал (не +/- бесконечность)

ВОЗРАСТ (временная метка, timestamp), ВОЗРАСТ (временная метка)

ВОЗРАСТ (временная метка, timestamp)

Когда вызывается с формой TIMESTAMP второго аргумента, AGE () вычитает аргументы, производя «символический» результат, который использует годы и месяцы и имеет тип INTERVAL.

Когда вызывается только с TIMESTAMP в качестве аргумента, AGE () вычитает из current_date (в полночь).

ВОЗРАСТ (временная метка, timestamp)

Когда вызывается с формой TIMESTAMP второго аргумента, AGE () вычитает аргументы, производя «символический» результат, который использует годы и месяцы и имеет тип INTERVAL.

Когда вызывается только с TIMESTAMP в качестве аргумента, AGE () вычитает из current_date (в полночь).

Примером функции AGE (timestamp, timestamp) является —

Приведенный выше оператор PostgreSQL даст следующий результат:

Примером функции AGE (отметка времени) является —

Приведенный выше оператор PostgreSQL даст следующий результат:

ТЕКУЩАЯ ДАТА / ВРЕМЯ ()

PostgreSQL предоставляет ряд функций, которые возвращают значения, связанные с текущей датой и временем. Ниже приведены некоторые функции —

Поставляет текущую дату.

Поставляет значения с часовым поясом.

Поставляет значения с часовым поясом.

При желании принимает параметр точности, который приводит к тому, что результат округляется до такого количества дробных цифр в поле секунд.

При желании принимает параметр точности, который приводит к тому, что результат округляется до такого количества дробных цифр в поле секунд.

Доставляет значения без часового пояса.

Доставляет значения без часового пояса.

При желании принимает параметр точности, который приводит к тому, что результат округляется до такого количества дробных цифр в поле секунд.

При желании принимает параметр точности, который приводит к тому, что результат округляется до такого количества дробных цифр в поле секунд.

Источник

Я часто вижу людей, которые предполагают, что DATEDIFF(YEAR, date_of_birth, GETDATE()) определят текущий возраст человека.

То есть в случае параметра YEAR DATEDIFF подсчитывает количество пересеченных 1-января. С параметром MONTH он будет считать число 1-го числа прошедшего месяца.

Так, например, ребенку, родившемуся 31 декабря 17 года, уже будет «1 год», когда на самом деле ему не исполнится 1 год до 31 декабря 18 года, и в настоящее время ему 0 лет.

Рассмотрев здесь хороший пример других вопросов, кажется, что нет однозначного ответа, и есть много ответов, которые совершенно неверны.

Я ищу ответ в следующих терминах:

Ответ должен быть встроенным выражением, которое можно выбрать или включить в предложение where.

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

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

Честно говоря, учитывая, сколько тонко неправильных ответов предостаточно (как я упоминал выше в моем первом абзаце), я бы подумал, что этот вопрос получит больше голосов и больше интереса, чем число голосов и 3, чтобы закрыть.

4 ответа

Правильный ответ

Собранный из приведенных источников, это правильный ответ для SQL Server (с 2012 года) :

Есть, конечно, множество других правильных способов, но это, кажется, встроенное решение, наиболее экономичное с синтаксисом, и я не видел ничего лучшего.

Неправильные ответы

Я просто подумал, что потрачу минуту на то, чтобы найти неправильные ответы в разных источниках, на пользу будущим читателям.

Как уже упоминалось в моем вопросе, это первый подход, который многие пытаются использовать. К сожалению, он учитывает только разницу в летней части даты, поэтому ребенку, родившемуся 31 декабря 17 года, исполняется 1 год 1 января 18 года. Это хорошо, но не правильно.

Похоже, это еще один общий подход, который также был приведен в комментарии к моему вопросу.

Дальнейшее уточнение делителя «число дней в году» после десятичной запятой не помогает, так как любой делитель выше 365 точно, в этом случае потерпит неудачу. Это хорошо, но не правильно.

Разновидностью (2) является использование часов вместо дней. В каждом дне есть фиксированное количество часов, поэтому 8766/24 = 365,25. Мы видим, что это решение эквивалентно (2). Это хорошо, но не правильно.

Другой вариант заключается в использовании округления по часам. Это имеет тот же дефект, что и (3), по тем же причинам, но дополнительно, если задействован компонент времени, он округляет вверх за последние 30 минут дня до ко дню рождения. Это хорошо, но не правильно.

Другие исследовали, может ли DAYOFYEAR предоставить решение. К сожалению, из-за високосных лет стандарт DAYOFYEAR не сопоставляется согласованно с конкретными датами (месяцами и месяцами) года. Это хорошо, но не правильно.

Возможно ответ

Это на самом деле может быть ближе к общему соглашению о том, когда день рождения отмечается для детей високосного года, но я указал в своем вопросе, что в таких случаях день рождения для целей расчета возраста человека следует рассматривать как 1 марта (что соответствует законодательству Великобритании).

MONTHS_BETWEEN также имеет другие причуды, которые могут быть нежелательны для расчета возраста (например, если он используется для расчета возраста в виде количества месяцев, например, для детей младше 1 года, когда выпадает «день рождения») в один и тот же день месяца или в последующие месяцы).

Это хорошо, , и в некоторых случаях это можно считать правильным!

Резюме

Конечно, есть и другие способы реализации правильного решения, чем тот, который приведен здесь, но следует принять во внимание список неправильных ответов (и много других необоснованных примеров, которые я здесь не рассматриваю), и любые инновации или альтернативные вычисления должны быть тщательно протестирован и сравнен с тем, который уже работает.

В Oracle вы можете сделать это так,

Если день рождения 29 февраля и 1 марта считается днем рождения, если год не високосный, вы можете использовать запрос ниже,

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

С. Нет.Описание функции
1