Подтвердить что ты не робот

Как получить разницу в годах от двух разных дат?

Я хочу получить разницу в годах от двух разных дат, используя базу данных 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 для получения результата?

4b9b3361

Ответ 1

Здесь выражение, которое также подходит для високосных лет:

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

Ответ 2

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)

Ответ 3

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

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

sqlfiddle

просто проще.

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

Число лет между датой 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,4 дня будут отображаться как 1 день, а 13,9 года - 13 лет. Аналогично, -1,4 года будут отображаться как -1 год, а -13,9 месяца будут отображаться как -13 месяцев.

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

Ответ 7

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

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);

Удерживайте слово как десятичное число в течение некоторого времени.