如何从两个不同的日期获得年份差异?
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 =>SQL 语法怎么样?是否有任何来自 MySQL 的内置函数来产生结果?
【问题讨论】:
【参考方案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
【讨论】:
非常感谢您的回复。对于#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);
将下限保留为小数在大多数情况下都是不正确的。
【讨论】:
以上是关于如何从两个不同的日期获得年份差异?的主要内容,如果未能解决你的问题,请参考以下文章