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ơ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(&#39;2024-12-30&#39;, &#39;2024-12-25&#39;) AS diff_in_days;<br /> -- 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(), &#39;2024-01-01&#39;) AS days_elapsed;<br /> -- Kết quả: Số ng&agrave;y từ ng&agrave;y 01-01-2024 đến hiện tại

3. Kiểm tra ngày trong tương lai:

SELECT DATEDIFF(&#39;2024-01-15&#39;, CURDATE()) AS days_until_event;<br /> -- Kết quả: Số ng&agrave;y từ h&ocirc;m nay đến ng&agrave;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 (&#39;YYYY-MM-DD&#39;), 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(&#39;2024-12-30&#39;, &#39;2024-12-25&#39;) AS diff_in_days;<br /> -- Kết quả: 5 (c&aacute;ch nhau 5 ng&agrave;y)

2. So sánh ngày hiện tại với một ngày trong quá khứ

sql

SELECT DATEDIFF(CURDATE(), &#39;2024-01-01&#39;) AS days_since_start_of_year;<br /> -- T&iacute;nh số ng&agrave;y từ ng&agrave;y 1/1/2024 đến ng&agrave;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<br /> FROM tasks WHERE DATEDIFF(deadline, CURDATE()) &lt;= 7;<br /> -- Liệt k&ecirc; c&aacute;c c&ocirc;ng việc sắp hết hạn trong v&ograve;ng 7 ng&agrave;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;<br /> -- T&iacute;nh số ng&agrave;y m&agrave; mỗi nh&acirc;n vi&ecirc;n đ&atilde; l&agrave;m việc từ ng&agrave;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<br /> FROM customers<br /> WHERE DATEDIFF(CURDATE(), registration_date) = 30;<br /> -- Liệt k&ecirc; kh&aacute;ch h&agrave;ng đăng k&yacute; đ&uacute;ng 30 ng&agrave;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<br /> FROM orders WHERE DATEDIFF(CURDATE(), delivery_date) &gt; 0;<br /> -- Danh s&aacute;ch c&aacute;c đơn h&agrave;ng giao trễ (c&aacute;c đơn h&agrave;ng m&agrave; ng&agrave;y giao đ&atilde; 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<br /> FROM customers<br /> WHERE DATEDIFF(DATE_ADD(CURDATE(), INTERVAL 10 DAY), birth_date) % 365 &lt;= 10<br /> AND DATEDIFF(CURDATE(), birth_date) % 365 &gt; 0;<br /> -- T&igrave;m kh&aacute;ch h&agrave;ng c&oacute; sinh nhật từ h&ocirc;m nay đến 10 ng&agrave;y sau

8. Phân nhóm dữ liệu dựa trên khoảng thời gian

sql

SELECT<br /> CASE WHEN DATEDIFF(end_date, start_date) &lt;= 7<br /> THEN &#39;1 week or less&#39; WHEN DATEDIFF(end_date, start_date) &lt;= 30<br /> THEN &#39;1 month or less&#39; ELSE &#39;More than 1 month&#39;<br /> END AS time_category, COUNT(*) AS total_events<br /> FROM events GROUP BY time_category;<br /> -- Ph&acirc;n loại sự kiện theo thời gian k&eacute;o d&agrave;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<br /> FROM events WHERE DATEDIFF(event_date, CURDATE()) &gt;= 0 ORDER BY days_until_event ASC;<br /> -- Sắp xếp c&aacute;c sự kiện sắp diễn ra theo thời gian c&ograve;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<br /> FROM projects WHERE DATEDIFF(end_date, start_date) &lt; 0;<br /> -- T&igrave;m c&aacute;c dự &aacute;n c&oacute; ng&agrave;y kết th&uacute;c trước ng&agrave;y bắt đầu (dữ liệu kh&ocirc;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.
TAGS: mysql
About the Author

Tin liên quan