如何从两个不同的日期获得多年的差异?

时间:2011-10-13 05:00:21

标签: mysql sql

我希望使用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是否有内置函数来生成结果?

6 个答案:

答案 0 :(得分:57)

这也是迎合闰年的表达方式:

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

这是有效的,因为如果date1是“年初”而不是date2 ,则表达式(DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))true,因为在mysql中,true = 1和{{ 1}},所以调整只是减去比较的“真相”。

这给出了测试用例的正确值,除了测试#3 - 我认为它应该是“3”以与测试#1保持一致:

false = 0

输出:

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;

请参阅SQLFiddle

答案 1 :(得分:11)

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)

答案 2 :(得分:6)

只需:SELECT TIMESTAMPDIFF(YEAR, date1, date2) AS difference FROM table

答案 3 :(得分:3)

你可以使用

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

如果你想要一个正数,无论哪个日期先于另一个,都用ABS()包裹。

使用ROUND(),0。6年将被视为1年,如果您只想计算整年,则可以使用FLOOR()。在这种情况下,0。6年将被视为0年,而1。9年将被视为1年。

答案 4 :(得分:0)

date1和date2之间的年数:

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。

答案 5 :(得分:0)

这很好用,即使考虑到闰年:

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

在大多数情况下,将小数保持在十进制位置是不正确的。