我希望使用MySQL数据库从两个不同日期获得差异。
例如:
SQL语法怎么样? MySQL是否有内置函数来生成结果?
答案 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.4天显示为1天,13。9年显示为13年。同样, - 1。4年将显示为 - 1年,-13.9个月将显示为-13个月。
请注意,在很多情况下我使用布尔表达式。因为布尔表达式的计算结果为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);
在大多数情况下,将小数保持在十进制位置是不正确的。