Вопрос по mysql – Получите разницу в годах между двумя датами в MySQL как целое число
Я пытаюсь подсчитать, сколько лет человеку в базе данных.
Предположим, у нас есть эта простая таблица:
<code>student(id, birth_date); </code>
Где id - это первичный ключ (действительно, таблица более сложная, но я упростил ее).
Я хочу узнать, сколько лет одному человеку:
<code>select id, datediff(curdate(),birth_date) from student </code>
Но он возвращает результат в днях, а не в годах. Я мог бы разделить его на 365:
<code>select id, datediff(curdate(),birth_date) / 365 from student </code>
Но он возвращает значение с плавающей запятой, и я хочу целое число.
Чтобы я мог рассчитать годы:
<code>select id, year(curdate())-year(birth_date) from student </code>
Но есть проблема: например, сейчас май, если на человека, родившегося в июне 1970 года, ему еще 31 год, а не 32, но выражение возвращает 32.
Я не могу выйти из этой проблемы, кто-то может мне помочь?
select id, CAST(datediff(curdate(),birth_date) / 365 as int)
from student
Если вы хотите прочитать оCONVERT()
а такжеCAST()
вот ссылка.
Другой способ сделать это:
SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS difference FROM student
Для различий в месяцах заменитьYEAR
сMONTH
и за сутки заменитьYEAR
сDAY
Надеюсь, это поможет!
TIMESTAMPDIFF
: dev.mysql.com/doc/refman/5.6/en/…
чтобы добавить комментарий к ответу Rat-a-tat-a-tat Ratatouille, чтобы улучшить его код. Вот лучший SQL-запрос:
SELECT IFNULL(TIMESTAMPDIFF(YEAR, birthdate, CURDATE()), YEAR(CURDATE()) - YEAR(birthdate)) AS age
Это лучше, потому что иногда "дата рождения" может содержать только год рождения, а день и месяц - 0. Если TIMESTAMPDIFF () возвращает NULL, мы можем определить приблизительный возраст, вычтя текущий год из года рождения.
но может привести к неправильным результатам.
По факту,/ 365
не учитывает високосные годы и может привести к ложным результатам, если вы сравните дату, в которой день и месяц совпадают с датой рождения.
Чтобы быть более точным, вы должны разделить его на среднее число дней в годах за 4 года, aka (365 * 4) + 1 (високосный год каждые 4 года) = & gt; 365,25
И вы будете более точным
select id, floor(datediff(curdate(),birth_date) / 365.25) from student
Проверено на одном из моих проектов, и оно работает.