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"
- Выборка постов с определёнными тегами
- Выборка людей определённого возраста
Как вычислить полный возраст по дате рождения?

Есть таблица
Делаю запрос
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;

Результат
Почему некоторые записи возраст выходит 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;

Вроде дата парситься норм.
- Вопрос задан более трёх лет назад
- 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.