Đây là biểu thức cũng phục vụ cho những năm nhuận:
YEAR(date1) - YEAR(date2) - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))
Điều này hoạt động vì biểu thức (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d'))
là true
nếu date1 "sớm hơn trong năm" so với date2 và bởi vì trong mysql, true = 1
và false = 0
, do đó, việc điều chỉnh chỉ là vấn đề trừ đi "sự thật" của phép so sánh.
Điều này cung cấp các giá trị chính xác cho các trường hợp thử nghiệm của bạn, ngoại trừ thử nghiệm số 3 - Tôi nghĩ nó phải là "3" để phù hợp với thử nghiệm số 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;
Đầu ra:
+------------+------------+------------+
| 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 |
+------------+------------+------------+
Xem SQLFiddle