Вопрос по mysql – Получите разницу в годах между двумя датами в MySQL как целое число

17

Я пытаюсь подсчитать, сколько лет человеку в базе данных.
Предположим, у нас есть эта простая таблица:

<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.
Я не могу выйти из этой проблемы, кто-то может мне помочь?

Ха, мне нужно подсчитать возраст ученика в моей базе данных, и ты почти задал мой точный вопрос ... за 6 лет до этого. Спасибо! Переполнение стека это здорово. aero

Ваш Ответ

9   ответов
0

select id, CAST(datediff(curdate(),birth_date) / 365 as int)
from student

Если вы хотите прочитать оCONVERT() а такжеCAST() вот ссылка.

56

Другой способ сделать это:

SELECT TIMESTAMPDIFF(YEAR, date_of_birth, CURDATE()) AS difference FROM student

Для различий в месяцах заменитьYEAR сMONTHи за сутки заменитьYEAR сDAY

Надеюсь, это поможет!

То же самое относится ко всему - это самый простой и элегантный ответ.
Пожалуйста, отметьте это как правильный ответ, остальные не являются точными !!!
Вот официальный документTIMESTAMPDIFF: dev.mysql.com/doc/refman/5.6/en/…
Согласовано. Наиболее точный.
4

SELECT 
  DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birth_date)), '%Y')+0
  AS age FROM student;
Error: User Rate Limit ExceededSELECT YEAR(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS("1975-04-20")));Error: User Rate Limit Exceeded
0

чтобы добавить комментарий к ответу Rat-a-tat-a-tat Ratatouille, чтобы улучшить его код. Вот лучший SQL-запрос:

SELECT IFNULL(TIMESTAMPDIFF(YEAR, birthdate, CURDATE()), YEAR(CURDATE()) - YEAR(birthdate)) AS age

Это лучше, потому что иногда "дата рождения" может содержать только год рождения, а день и месяц - 0. Если TIMESTAMPDIFF () возвращает NULL, мы можем определить приблизительный возраст, вычтя текущий год из года рождения.

1

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

0

DATE_FORMAT(NOW(),"%Y")
   -DATE_FORMAT(BirthDate,'%Y')
   -(
     IF(
      DATE_FORMAT(NOW(),"%m-%d") < DATE_FORMAT(BrthDate,'%m-%d'),
      1,
      0
     )
    ) as Age

Это должно работать с високосными годами очень хорошо ;-)

4

но может привести к неправильным результатам.

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

Чтобы быть более точным, вы должны разделить его на среднее число дней в годах за 4 года, aka (365 * 4) + 1 (високосный год каждые 4 года) = & gt; 365,25

И вы будете более точным

select id, floor(datediff(curdate(),birth_date) / 365.25) from student

Проверено на одном из моих проектов, и оно работает.

Error: User Rate Limit Exceeded Ramy Al Zuhouri
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded/365Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Ramy Al Zuhouri
Error: User Rate Limit Exceededhappen to workError: User Rate Limit Exceededselect floor(datediff("2117-03-19", "2075-03-19") / 365.25)Error: User Rate Limit Exceeded
0

select floor((cast(date_format('2016-02-29','%Y%m%d') as int) - cast(date_format('1966-03-01','%Y%m%d') as int)/10000);

Просто не забудьте сохранитьfloor() поскольку десятичная дробь не нужна

15
select id, floor(datediff(curdate(),birth_date) / 365)
from student

Согласиться с @Schwern
Это не учитывает високосные годы. Дрейф может стать значительным.select floor(datediff("2017-03-19", "1975-03-30") / 365); говорит 42. Этому человеку 41, 11 выходных.
Не используйте этот ответ.

Похожие вопросы