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ầu | Cú pháp | Kết quả ví dụ |
|---|---|---|
| Số ngày (có âm - EndDate trước StartDate) | DATEDIFF(EndDate, StartDate) | 181 / -181 |
| Số ngày tuyệt đối | ABS(DATEDIFF(StartDate, EndDate)) | 181 |
| Số ngày + 1 (tính cả ngày đầu và cuối) | DATEDIFF(EndDate, StartDate) + 1 | 182 |
| Số tuần | FLOOR(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à DATETIMETIMESTAMPDIFF()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ề
NULLnếu bất kỳ tham số nào là NULL