Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn MySQL đếm số ngày trong khoảng ngày có ngày bắt đầu và kết thúc

Tính số ngày giữa hai ngày (Date Range) trong MySQL

Sử dụng hàm DATEDIFF() để tính hiệu số ngày giữa hai cột DATE hoặc DATETIME. Kết hợp ABS() để luôn ra số dương.

Cú pháp

DATEDIFF(date1, date2)  -- Trả về date1 - date2 (số ngày, có thể âm)
ABS(DATEDIFF(date1, date2))  -- Giá trị tuyệt đối (luôn dương)

Ví dụ minh họa

Tạo bảng DemoTable730:

mysql> CREATE TABLE DemoTable730 (
    StartDate DATE,
    EndDate DATE
);
Query OK, 0 rows affected (0.45 sec)

Chèn dữ liệu:

mysql> INSERT INTO DemoTable730 VALUES('2019-01-21', '2019-07-21');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable730 VALUES('2018-10-11', '2018-12-31');
Query OK, 1 row affected (0.46 sec)
mysql> INSERT INTO DemoTable730 VALUES('2016-01-01', '2016-12-31');
Query OK, 1 row affected (0.14 sec)

Xem dữ liệu:

mysql> SELECT * FROM DemoTable730;
+------------+------------+
| StartDate  | EndDate    |
+------------+------------+
| 2019-01-21 | 2019-07-21 |
| 2018-10-11 | 2018-12-31 |
| 2016-01-01 | 2016-12-31 |
+------------+------------+
3 rows in set (0.00 sec)

Tính số ngày chênh lệch (giá trị tuyệt đối):

mysql> SELECT ABS(DATEDIFF(StartDate, EndDate)) AS Days FROM DemoTable730;

Kết quả:

+------+
| Days |
+------+
| 181  |
| 81   |
| 365  |
+------+
3 rows in set (0.00 sec)

Các biến thể hữu ích

Yêu cầuCú phápKết quả ví dụ
Số ngày (có âm - EndDate trước StartDate)DATEDIFF(EndDate, StartDate)181 / -181
Số ngày tuyệt đốiABS(DATEDIFF(StartDate, EndDate))181
Số ngày + 1 (tính cả ngày đầu và cuối)DATEDIFF(EndDate, StartDate) + 1182
Số tuầnFLOOR(DATEDIFF(EndDate, StartDate) / 7)25
Số tháng (xấp xỉ)TIMESTAMPDIFF(MONTH, StartDate, EndDate)6
Số năm (xấp xỉ)TIMESTAMPDIFF(YEAR, StartDate, EndDate)0

Hàm TIMESTAMPDIFF() - Chính xác hơn cho tháng/năm

SELECT 
    TIMESTAMPDIFF(DAY, StartDate, EndDate) AS Days,
    TIMESTAMPDIFF(MONTH, StartDate, EndDate) AS Months,
    TIMESTAMPDIFF(YEAR, StartDate, EndDate) AS Years
FROM DemoTable730;

Lưu ý

  • DATEDIFF() chỉ tính chênh lệch ngày, bỏ qua phần giờ nếu cột là DATETIME
  • TIMESTAMPDIFF() tính chính xác theo đơn vị (month, year) dựa trên lịch thực tế
  • Cả hai hàm đều trả về NULL nếu bất kỳ tham số nào là NULL