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

Hàm DATEDIFF trong MySQL được sử dụng để tính số ngày chênh lệch giữa hai giá trị ngày (DATE hoặc DATETIME). Nó trả về giá trị là một số nguyên, đại diện cho sự khác biệt về ngày giữa hai mốc thời gian.
Mục lục

Đị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ơn date2 (ngày đầu tiên nằm sau ngày thứ hai).
    • Âm: Nếu date1 nhỏ hơn date2 (ngày đầu tiên nằm trước ngày thứ hai).
    • Bằng 0: Nếu hai ngày trùng nhau.

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 ý:

  1. 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.
  2. Dữ liệu không hợp lệ:

    • Nếu date1 hoặc date2 không hợp lệ, MySQL sẽ trả về NULL.
  3. 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ặc DATETIME.

Ứ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).
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
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

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.
About the Author

Tin liên quan