我想使用MySQL数据库从两个不同的日期中得到年份的差异.

例如:

  • 2011-07-20 - 2011-07-18 => 0 year
  • 2011-07-20 - 2010-07-20 => 1 year
  • 2011-06-15 - 2008-04-11 => 2 3 years
  • 2011-06-11 - 2001-10-11 => 9 years

SQL语法如何?MySQL是否有任何内置函数来生成结果?

推荐答案

下面的表达也迎合了闰年:

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 = 1false = 0中,调整只是减go 比较的"真相"的问题.

这为您的测试用例提供了正确的值,但测试#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

Mysql相关问答推荐

在MySQL中查找具有公共值的列名

如何合并有多行的json列

如何从MySQL数据库中提取入职第一个月的工作天数?

MySQL 8.0.33 Select json列时出现错误:排序内存不足,请考虑增加服务器排序缓冲区大小

Mysql如何分行分词

Select 最高等级最多的部门名称

MySQL 在第一个匹配行后停止搜索 N 行(不是 LIMIT)

mysql insert into select join - 通过连接表将值从一列复制到另一表

MYSQL:如何根据之前的相关记录获取记录

为什么一个 10 位的电话号码不能存储在长度为 10 的整数中?

创建表时我的 SQL 语句有什么问题

Golang Gorm没有从关联表中检索数据

PHP,MySQL 错误:列计数与第 1 行的值计数不匹配

在mysql中将纪元数转换为人类可读的日期

如何在 python 中逐行获取 MySQL ResultSet

MySQL 导出到 outfile:CSV 转义字符

将 JavaScript 到日期对象转换为 MySQL 日期格式 (YYYY-MM-DD)

按 COUNT(*) 过滤?

MySql 两个时间戳之间的天数差异?

MySQL中的base64编码