【发布时间】: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 =>
23 年 - 2011-06-11 - 2001-10-11 => 9 年
SQL 语法怎么样?是否有任何来自 MySQL 的内置函数来产生结果?
【问题讨论】:
我想使用 MySQL 数据库获取两个不同日期的年份差异。
例如:
SQL 语法怎么样?是否有任何来自 MySQL 的内置函数来产生结果?
【问题讨论】:
这也是闰年的表达方式:
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 |
+------------+------------+------------+
【讨论】:
我喜欢 Bohemian 的解决方案,但是如何使用 timestampdiff
select date1, date2,timestampdiff(YEAR,date2,date1) from so7749639
似乎更容易。
【讨论】:
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)
【讨论】:
只需:SELECT TIMESTAMPDIFF(YEAR, date1, date2) AS difference FROM table。
【讨论】:
你可以使用
SELECT ROUND((TO_DAYS(date2) - TO_DAYS(date1)) / 365) ...
如果你想要一个正数,也可以用ABS() 包裹它,不管哪个日期早于另一个。
使用ROUND(),0.6 年将被视为 1 年,如果您只想计算整年,则可以使用 FLOOR()。在这种情况下,0.6 年将被视为 0 年,1.9 年将被视为 1 年。
【讨论】:
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。
【讨论】:
这很好用,即使考虑到闰年:
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);
将下限保留为小数在大多数情况下都是不正确的。
【讨论】: