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

Posted

技术标签:

【中文标题】如何从两个不同的日期获得年份差异?【英文标题】:How to get the difference in years from two different dates? 【发布时间】:2011-10-13 05:00:20 【问题描述】:

我想使用 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 的内置函数来产生结果?

【问题讨论】:

【参考方案1】:

这也是闰年的表达方式:

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

这是有效的,因为表达式(DATE_FORMAT(date1, '%m%d') &lt; DATE_FORMAT(date2, '%m%d'))true,如果 date1 比 date2“更早”并且因为在 mysql 中,true = 1false = 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

【讨论】:

非常感谢您的回复。对于#3 测试用例,它应该是 3 年。我有另一个测试用例(闰年):2007-07-20 - 2004-07-20 => 3 年,但结果仍然是 2 年。 @aslingga 没问题。我已经改进了解决方案,因此它现在适用于您的所有测试,包括闰年问题。 嘿,我能够达到上述结果,但我的条件是我需要 0.5 年、1 年、1.5 年、2 年、2.5 年等等......我怎么能这样做!! @dipen 这是一个不同的问题,所以问一个新问题。此外,此解决方案不能适用于返回分数年。【参考方案2】:

我喜欢 Bohemian 的解决方案,但是如何使用 timestampdiff

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

sqlfiddle

似乎更容易。

【讨论】:

这是最好/最简单的答案。【参考方案3】:
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)

【讨论】:

询问者根本没有提到他们,所以我认为他不在乎。 抱歉,我忘记添加闰年的测试用例了。【参考方案4】:

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

【讨论】:

【参考方案5】:

你可以使用

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

如果你想要一个正数,也可以用ABS() 包裹它,不管哪个日期早于另一个。

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

【讨论】:

两次都应该是 TO_DAYS。我无法编辑它,因为编辑必须 >=6 个符号。请更正【参考方案6】:

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

现在介绍一些关于这些的cmets。

    这些结果返回整数年、月和日。他们是“地板”。因此,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);

将下限保留为小数在大多数情况下都是不正确的。

【讨论】:

以上是关于如何从两个不同的日期获得年份差异?的主要内容,如果未能解决你的问题,请参考以下文章

如何在距当前日期 3(不同)天(差异)的情况下获得结果?

如何从python中不同类型的日期中提取年份

从Oracle中的日期差异计算年份

获取不同年份中按日/月的最早日期

如何计算不同时区的两个 NSDate 对象之间的天数差异?

如何在Java中获取与01/01不同的日期开始的一年的上一个/当前季度和年份的开始和结束日期