Перейти к содержимому

Как найти возраст в sql

  • автор:

SQL → Вычислить возраст по дате рождения

Более универсальный вариант SQL запроса из официальной документации:

SELECT birthday, ( (YEAR(CURRENT_DATE) - YEAR(birthday)) - /* step 1 */ (DATE_FORMAT(CURRENT_DATE, '%m%d') < DATE_FORMAT(birthday, '%m%d')) /* step 2 */ ) AS age FROM users

Смысл следующий — первым шагом вычитаем из текущего года, год рождения, вторым шагом вычитаем единичку если дня рождения в этом году ещё не было.

birthday это поле с датой в любом валидном формате (не timestamp), например 1989-07-22 или даже 1989-07-22T00:00:00 .

Похожие записи

  • Экспорт/импорт большой базы
  • Узнать следующую и предыдущую запись в выборке по полю с неуникальными значениями
  • Избавляемся от ошибки "MySQL server has gone away"
  • Выборка постов с определёнными тегами
  • Выборка людей определённого возраста

Как вычислить полный возраст по дате рождения?

5f5a4c4892a52910613410.png

Есть таблица

Делаю запрос

SELECT id, birthday, DATE_FORMAT( FROM_DAYS( DATEDIFF(str_to_date('14.09.20', '%d.%m.%y'), str_to_date(birthday, '%d.%m.%y')) ), '%y Years %m Months %d Days' ) AS age FROM children LIMIT 15;

5f5a4cc296e17110125474.png

Результат

Почему некоторые записи возраст выходит 0 ? Что не так ?
update:

SELECT id, birthday, str_to_date(birthday, '%d.%m.%y') as born, DATE_FORMAT( FROM_DAYS( DATEDIFF(str_to_date('14.09.20', '%d.%m.%y'), str_to_date(birthday, '%d.%m.%y')) ), '%y Years %m Months %d Days' ) AS age FROM children LIMIT 15;

5f5a506b46b8f219422214.png

Вроде дата парситься норм.

  • Вопрос задан более трёх лет назад
  • 1990 просмотров

3 комментария

Средний 3 комментария

Пользовательские функции и процедуры MS SQL

MS SQL user function, procedures – Пользовательские функции и процедуры MS SQL.

Полный возраст в MS SQL.

В MS SQL Server есть очень удобная и замечательная встроенная функция datediff, которая возвращает разницу между двумя датами. Например, следующий запрос вернет разницу в годах между 31-м декабря 2014 года и 1-м января 2015 года:

select datediff(year, '2014-12-31', '2015-01-01')

Результат запроса будет равен 1, хотя разница между двумя всего 1 день. Дело в том, что datediff возвращает количество пересеченных границ указанных аргументом datepart, за период времени между аргументами startdate и enddate функции.
Такой результат не очень устраивает нас, если мы хотим определить количество полных лет между двумя датами, т.е. возраст на определенную дату. Немного дополним вывод этой функции и оформим в виде функции:

create function [dbo].fullAge (@startdate datetime , @enddate datetime) returns int as begin return (datediff(year, @startdate, @enddate) - case when month(@startdate) < month(@enddate) then 0 when month(@startdate) >month(@enddate) then 1 when day(@startdate) > day(@enddate) then 1 else 0 end) end

Здесь вначале находится разница в годах между двумя календарными датами функцией datediff и от неё вычитается 1, если в календарном году даты @enddate месяц и дата переменной @startdate еще не наступили относительно переменной @enddate.

Вычислить возраст по дате рождения

ответ 29 , а фактически возраст пользователя 28 , ему еще не исполнилось 29 Можно ли вычислить реальный возраст по дате рождения?

Отслеживать
задан 26 фев 2018 в 12:51
169 2 2 золотых знака 2 2 серебряных знака 16 16 бронзовых знаков

Добрый день. А зачем нагружать этим вычисление sql? Может будет лучше это сделать уже после запроса, на сервере и отдать клиенту готовый результат?

– user216615
26 фев 2018 в 12:54
Так не пробовали: SELECT date_part('year',age('1989-12-22'::date)) ?
26 фев 2018 в 12:55
@MaxU спасибо подошло, можете оформить как ответ
26 фев 2018 в 13:00

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Можно воспользоваться функцией age() и вычленить год из результата:

SELECT date_part('year',age('1989-12-22'::date)) 

Отслеживать
ответ дан 26 фев 2018 в 13:10
MaxU - stand with Ukraine MaxU - stand with Ukraine
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака

  • sql
  • postgresql
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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

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