Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để nhận được sự khác biệt trong năm từ hai ngày khác nhau?

Đâ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'))true nếu date1 "sớm hơn trong năm" so với date2 bởi vì trong mysql, true = 1false = 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bạn không thể chỉ định bảng đích để cập nhật trong mệnh đề FROM

  2. proxysql-admin Alternatives - ClusterControl ProxySQL GUI

  3. Mã API đầu tiên của bạn với Node.js và Express:Kết nối cơ sở dữ liệu

  4. Làm thế nào để chèn vào cùng một bảng trong MySQL?

  5. Cách cấp tất cả các đặc quyền cho người dùng root trong MySQL 8.0