Как получить разницу в годах от двух разных дат? - PullRequest
33 голосов
/ 13 октября 2011

Я хочу получить разницу в годах от двух разных дат, используя базу данных MySQL.

например:

  • 2011-07-20 - 2011-07-18 => 0 год
  • 2011-07-20 - 2010-07-20=> 1 год
  • 2011-06-15 - 2008-04-11 => 2 3 года
  • 2011-06-11 - 2001-10-11 => 9 лет

Как насчет синтаксиса SQL?Есть ли встроенная функция из MySQL для получения результата?

Ответы [ 7 ]

56 голосов
/ 13 октября 2011

Вот выражение, которое также учитывает високосные годы:

YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))

Это работает, потому что выражение (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d')) равно true, если date1 "раньше в году", чем date2 и потому что в mysql, true = 1 и false = 0, так что корректировка - это просто вопрос вычитания «правды» сравнения.

Это дает правильные значения для ваших тестовых случаев, за исключением теста# 3 - Я думаю, что должно быть "3", чтобы соответствовать тесту № 1:

create table so7749639 (date1 date, date2 date);
insert into so7749639 values
('2011-07-20', '2011-07-18'),
('2011-07-20', '2010-07-20'),
('2011-06-15', '2008-04-11'),
('2011-06-11', '2001-10-11'),
('2007-07-20', '2004-07-20');
select date1, date2,
YEAR(date1) - YEAR(date2)
    - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d')) as diff_years
from so7749639;

Вывод:

+------------+------------+------------+
| date1      | date2      | diff_years |
+------------+------------+------------+
| 2011-07-20 | 2011-07-18 |          0 |
| 2011-07-20 | 2010-07-20 |          1 |
| 2011-06-15 | 2008-04-11 |          3 |
| 2011-06-11 | 2001-10-11 |          9 |
| 2007-07-20 | 2004-07-20 |          3 |
+------------+------------+------------+

См. SQLFiddle

18 голосов
/ 27 августа 2015

Мне нравится решение от Bohemian, но как насчет использования timestampdiff

select date1, date2,timestampdiff(YEAR,date2,date1) from so7749639

sqlfiddle

просто кажется проще.

11 голосов
/ 13 октября 2011
mysql> SELECT FLOOR(DATEDIFF('2011-06-11','2001-10-11')/365);
+------------------------------------------------+
| FLOOR(DATEDIFF('2011-06-11','2001-10-11')/365) |
+------------------------------------------------+
|                                              9 |
+------------------------------------------------+
1 row in set (0.00 sec)

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

mysql> SELECT FLOOR(DATEDIFF('2007-07-11','2004-07-11')/365);
+------------------------------------------------+
| FLOOR(DATEDIFF('2007-07-11','2004-07-11')/365) |
+------------------------------------------------+
|                                              3 |
+------------------------------------------------+
1 row in set (0.00 sec)
6 голосов
/ 19 сентября 2016

Просто по: SELECT TIMESTAMPDIFF(YEAR, date1, date2) AS difference FROM table.

3 голосов
/ 13 октября 2011

Вы можете просто использовать

SELECT ROUND((TO_DAYS(date2) - TO_DAYS(date1)) / 365) ...

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

С ROUND()0,6 года будут считаться 1 годом, если вместо этого вы хотите считать только полные годы, вы можете использовать FLOOR().В этом случае 0,6 года будет считаться 0 годами, а 1,9 года - 1 годом.

0 голосов
/ 08 декабря 2016

Это хорошо работает, даже учитывая високосные годы:

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

Сохранить слово как десятичное число будет неверно в большинстве случаев.

0 голосов
/ 13 октября 2011

Количество лет между датой 1 и датой 2:

IF((YEAR(date2) - YEAR(date1)) > 0, (YEAR(date2) - YEAR(date1)) - (MID(date2, 6, 5) < 
MID(date1, 6, 5)), IF((YEAR(date2) - YEAR(date1)) < 0, (YEAR(date2) - YEAR(date1)) + 
(MID(date1, 6, 5) < MID(date2, 6, 5)), (YEAR(date2) - YEAR(date1))))

Теперь о некоторых комментариях по этому поводу.

  1. Эти результаты возвращают целое число лет, месяцев идней.Они "полы".Таким образом, 1,4 дня будут отображаться как 1 день, а 13,9 года будут отображаться как 13 лет.Аналогично, -1,4 года будут отображаться как -1 год, а -13,9 месяца будут отображаться как -13 месяцев.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...