Cách truy vấn số ngày chênh lệch giữa hai giá trị ngày trong MySQL với hàm DATEDIFF
Định nghĩa hàm DATEDIFF trong MySQL
Cú pháp:
DATEDIFF(date1, date2)
date1
: Ngày đầu tiên (hoặc mốc thời gian đầu tiên).date2
: Ngày thứ hai (hoặc mốc thời gian thứ hai).- Kết quả trả về:
- Dương: Nếu
date1
lớn hơndate2
(ngày đầu tiên nằm sau ngày thứ hai). - Âm: Nếu
date1
nhỏ hơndate2
(ngày đầu tiên nằm trước ngày thứ hai). - Bằng 0: Nếu hai ngày trùng nhau.
- Dương: Nếu
Ví dụ:
1. Tính số ngày giữa hai ngày cố định:
SELECT DATEDIFF('2024-12-30', '2024-12-25') AS diff_in_days;
-- Kết quả: 5
2. Tính số ngày giữa ngày hiện tại và một ngày trong quá khứ:
SELECT DATEDIFF(CURDATE(), '2024-01-01') AS days_elapsed;
-- Kết quả: Số ngày từ ngày 01-01-2024 đến hiện tại
3. Kiểm tra ngày trong tương lai:
SELECT DATEDIFF('2024-01-15', CURDATE()) AS days_until_event;
-- Kết quả: Số ngày từ hôm nay đến ngày 15-01-2024
Lưu ý:
-
Hàm chỉ so sánh phần ngày:
- Nếu sử dụng dữ liệu dạng
DATETIME
, hàm sẽ bỏ qua phần thời gian (giờ, phút, giây) và chỉ so sánh theo ngày.
- Nếu sử dụng dữ liệu dạng
-
Dữ liệu không hợp lệ:
- Nếu
date1
hoặcdate2
không hợp lệ, MySQL sẽ trả vềNULL
.
- Nếu
-
Tương thích các định dạng ngày:
- Đầu vào có thể là chuỗi ngày (
'YYYY-MM-DD'
), giá trịDATE
, hoặcDATETIME
.
- Đầu vào có thể là chuỗi ngày (
Ứng dụng:
- Tính số ngày còn lại đến hạn chót.
- Xác định thời gian giữa hai mốc.
- Kiểm tra dữ liệu không hợp lệ (ngày kết thúc trước ngày bắt đầu).
Một số ví dụ DATEDIFF trong MySQL
Hàm DATEDIFF
trong MySQL được sử dụng để tính số ngày giữa hai mốc thời gian (date hoặc datetime). Dưới đây là 10 ví dụ minh họa cách sử dụng hàm này trong các tình huống thực tế:
1. Tính số ngày giữa hai ngày cố định
SELECT DATEDIFF('2024-12-30', '2024-12-25') AS diff_in_days;
-- Kết quả: 5 (cách nhau 5 ngày)
2. So sánh ngày hiện tại với một ngày trong quá khứ
sql
SELECT DATEDIFF(CURDATE(), '2024-01-01') AS days_since_start_of_year;
-- Tính số ngày từ ngày 1/1/2024 đến ngày hiện tại
3. Kiểm tra hạn chót công việc
sql
SELECT task_id, DATEDIFF(deadline, CURDATE()) AS days_remaining
FROM tasks WHERE DATEDIFF(deadline, CURDATE()) <= 7;
-- Liệt kê các công việc sắp hết hạn trong vòng 7 ngày
4. Tính thời gian nhân viên làm việc
sql
SELECT employee_id, DATEDIFF(CURDATE(), hire_date) AS days_worked FROM employees;
-- Tính số ngày mà mỗi nhân viên đã làm việc từ ngày họ được tuyển dụng
5. Tìm khách hàng sắp kỷ niệm 30 ngày đăng ký
sql
SELECT customer_id, registration_date, DATEDIFF(CURDATE(), registration_date) AS days_since_registration
FROM customers
WHERE DATEDIFF(CURDATE(), registration_date) = 30;
-- Liệt kê khách hàng đăng ký đúng 30 ngày trước
6. Tìm đơn hàng giĐịnh nghĩa hàm DATEDIFF
trong MySQLao trễ
sql
SELECT order_id, DATEDIFF(CURDATE(), delivery_date) AS days_overdue
FROM orders WHERE DATEDIFF(CURDATE(), delivery_date) > 0;
-- Danh sách các đơn hàng giao trễ (các đơn hàng mà ngày giao đã qua)
7. Tìm khách hàng có ngày sinh nhật trong vòng 10 ngày tới
sql
SELECT customer_id, birth_date
FROM customers
WHERE DATEDIFF(DATE_ADD(CURDATE(), INTERVAL 10 DAY), birth_date) % 365 <= 10
AND DATEDIFF(CURDATE(), birth_date) % 365 > 0;
-- Tìm khách hàng có sinh nhật từ hôm nay đến 10 ngày sau
8. Phân nhóm dữ liệu dựa trên khoảng thời gian
sql
SELECT
CASE WHEN DATEDIFF(end_date, start_date) <= 7
THEN '1 week or less' WHEN DATEDIFF(end_date, start_date) <= 30
THEN '1 month or less' ELSE 'More than 1 month'
END AS time_category, COUNT(*) AS total_events
FROM events GROUP BY time_category;
-- Phân loại sự kiện theo thời gian kéo dài
9. Tính thời gian còn lại cho một sự kiện
sql
SELECT event_name, DATEDIFF(event_date, CURDATE()) AS days_until_event
FROM events WHERE DATEDIFF(event_date, CURDATE()) >= 0 ORDER BY days_until_event ASC;
-- Sắp xếp các sự kiện sắp diễn ra theo thời gian còn lại
10. Kiểm tra hợp lệ giữa hai mốc thời gian
sql
SELECT project_id, DATEDIFF(end_date, start_date) AS project_duration
FROM projects WHERE DATEDIFF(end_date, start_date) < 0;
-- Tìm các dự án có ngày kết thúc trước ngày bắt đầu (dữ liệu không hợp lệ)
Lưu ý:
- Hàm
DATEDIFF
luôn trả về giá trị là số nguyên:- Số dương: Ngày thứ nhất sau ngày thứ hai.
- Số âm: Ngày thứ nhất trước ngày thứ hai.
- Nếu bạn cần tính chênh lệch thời gian nhỏ hơn ngày (như giờ hoặc phút), bạn nên sử dụng
TIMESTAMPDIFF
.