Câu truy vấn dấu thời gian ngày giờ phút trong mysql bằng cách sử dụng hàm TIMESTAMPDIFF

Dưới đây là một ví dụ về cách sử dụng hàm TIMESTAMPDIFF trong MySQL để so sánh hai cột ngày giờ và lấy sự khác biệt theo ngày, giờ, và phút.
Mục lục

MySQL là gì?

MySQL là một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS - Relational Database Management System) mã nguồn mở phổ biến nhất trên thế giới. Nó được phát triển lần đầu tiên bởi công ty Thụy Điển MySQL AB vào năm 1995 và hiện thuộc sở hữu của Oracle Corporation.

Các đặc điểm nổi bật của MySQL:

  1. Quan hệ (Relational):

    • Dữ liệu được tổ chức trong các bảng (tables) với các hàng (rows) và cột (columns), cho phép tạo ra các mối quan hệ giữa các bảng khác nhau.
  2. Hỗ trợ SQL (Structured Query Language):

    • Sử dụng ngôn ngữ SQL để quản lý, truy vấn và thao tác dữ liệu.
  3. Mã nguồn mở:

    • Miễn phí để sử dụng, và mã nguồn có thể được chỉnh sửa theo nhu cầu. (Ngoài ra còn có phiên bản trả phí với tính năng nâng cao.)
  4. Hiệu suất cao và đáng tin cậy:

    • Tối ưu hóa để xử lý khối lượng dữ liệu lớn với hiệu suất cao trong nhiều ứng dụng, từ các trang web nhỏ đến các hệ thống lớn.
  5. Tích hợp và linh hoạt:

    • Hỗ trợ nhiều nền tảng như Windows, Linux, macOS, và hoạt động tốt với nhiều ngôn ngữ lập trình như PHP, Python, Java, .NET, ...vv trong lĩnh vực thiết kế website
  6. Hỗ trợ đa người dùng:

    • Có khả năng quản lý nhiều tài khoản người dùng với quyền hạn được thiết lập rõ ràng, đảm bảo bảo mật.

MySQL cách sử dụng hàm TIMESTAMPDIFF

Truy vấn, tối ưu hóa, hoặc các vấn đề liên quan đến hàm timestampdiff trong MySQL

Ví dụ:

Giả sử bạn có một bảng tên là events với các cột sau:

  • event_id: ID của sự kiện.
  • start_time: Thời gian bắt đầu.
  • end_time: Thời gian kết thúc.

Truy vấn MySQL:

SELECT 
    event_id,
    TIMESTAMPDIFF(DAY, start_time, end_time) AS diff_in_days,    -- Sự khác biệt theo ngày
    TIMESTAMPDIFF(HOUR, start_time, end_time) AS diff_in_hours,  -- Sự khác biệt theo giờ
    TIMESTAMPDIFF(MINUTE, start_time, end_time) AS diff_in_minutes -- Sự khác biệt theo phút
FROM 
    events;

 

Giải thích:

  1. TIMESTAMPDIFF(DAY, start_time, end_time): Tính sự khác biệt giữa hai mốc thời gian theo số ngày.
  2. TIMESTAMPDIFF(HOUR, start_time, end_time): Tính sự khác biệt theo giờ.
  3. TIMESTAMPDIFF(MINUTE, start_time, end_time): Tính sự khác biệt theo phút.

Kết quả:

Kết quả sẽ trả về danh sách ID của các sự kiện cùng với sự khác biệt giữa start_timeend_time dưới dạng số ngày, giờ, và phút.

MySQL sử dụng hàm TIMESTAMPDIFF
MySQL sử dụng hàm TIMESTAMPDIFF - ảnh Panpic

Mở rộng câu truy vấn trên trong điều kiện WHERE là end_time lớn hơn start_time một ngày

Để mở rộng câu truy vấn và thêm điều kiện WHERE kiểm tra xem end_time lớn hơn start_time ít nhất một ngày, bạn có thể sử dụng TIMESTAMPDIFF trong phần WHERE. Dưới đây là truy vấn hoàn chỉnh:

Truy vấn mở rộng:

SELECT 
    event_id,
    TIMESTAMPDIFF(DAY, start_time, end_time) AS diff_in_days,    -- Sự khác biệt theo ngày
    TIMESTAMPDIFF(HOUR, start_time, end_time) AS diff_in_hours,  -- Sự khác biệt theo giờ
    TIMESTAMPDIFF(MINUTE, start_time, end_time) AS diff_in_minutes -- Sự khác biệt theo phút
FROM 
    events
WHERE 
    TIMESTAMPDIFF(DAY, start_time, end_time) >= 1; -- end_time lớn hơn start_time ít nhất một ngày
 

Giải thích:

  1. WHERE TIMESTAMPDIFF(DAY, start_time, end_time) >= 1:

    • Điều kiện này đảm bảo rằng end_time phải cách start_time ít nhất 1 ngày (tương đương với 24 giờ).
  2. Các cột được chọn:

    • diff_in_days: Hiển thị số ngày chênh lệch.
    • diff_in_hours: Hiển thị số giờ chênh lệch.
    • diff_in_minutes: Hiển thị số phút chênh lệch.

Lưu ý:

  • Hàm TIMESTAMPDIFF trả về giá trị dạng số nguyên, vì vậy bạn có thể sử dụng các toán tử so sánh như >=, =, hoặc < trong phần WHERE.

Mở rộng câu truy vấn trên trong điều kiện WHERE là end_time lớn hơn start_time 4 tiếng

Dưới đây là truy vấn mở rộng với điều kiện WHERE kiểm tra xem end_time lớn hơn start_time ít nhất 4 tiếng:

Truy vấn MySQL:

SELECT 
    event_id,
    TIMESTAMPDIFF(DAY, start_time, end_time) AS diff_in_days,    -- Sự khác biệt theo ngày
    TIMESTAMPDIFF(HOUR, start_time, end_time) AS diff_in_hours,  -- Sự khác biệt theo giờ
    TIMESTAMPDIFF(MINUTE, start_time, end_time) AS diff_in_minutes -- Sự khác biệt theo phút
FROM 
    events
WHERE 
    TIMESTAMPDIFF(HOUR, start_time, end_time) >= 4; -- end_time lớn hơn start_time ít nhất 4 tiếng

Giải thích:

  1. WHERE TIMESTAMPDIFF(HOUR, start_time, end_time) >= 4:

    • Điều kiện này đảm bảo rằng end_time phải lớn hơn start_time ít nhất 4 giờ.
  2. Hàm TIMESTAMPDIFF trong WHERE:

    • Hàm này trả về chênh lệch giữa hai mốc thời gian theo đơn vị giờ (HOUR), cho phép kiểm tra trực tiếp giá trị >= 4.
  3. Các cột trả về:

    • diff_in_days: Số ngày chênh lệch.
    • diff_in_hours: Số giờ chênh lệch.
    • diff_in_minutes: Số phút chênh lệch.

Lưu ý:

Nếu bạn muốn áp dụng thêm các điều kiện khác (ví dụ, khoảng thời gian giới hạn hoặc sự kiện có trạng thái cụ thể), bạn chỉ cần bổ sung các điều kiện đó trong phần WHERE như sau:

WHERE 
    TIMESTAMPDIFF(HOUR, start_time, end_time) >= 4 
    AND event_status = 'active';
 

Mở rộng câu truy vấn trên trong điều kiện WHERE là end_time lớn hơn start_time 30 phút

Để mở rộng truy vấn với điều kiện WHERE kiểm tra xem end_time lớn hơn start_time ít nhất 30 phút, ta chỉ cần thay đổi đơn vị tính trong hàm TIMESTAMPDIFF thành MINUTE và kiểm tra điều kiện >= 30.

Truy vấn MySQL:

SELECT 
    event_id,
    TIMESTAMPDIFF(DAY, start_time, end_time) AS diff_in_days,    -- Sự khác biệt theo ngày
    TIMESTAMPDIFF(HOUR, start_time, end_time) AS diff_in_hours,  -- Sự khác biệt theo giờ
    TIMESTAMPDIFF(MINUTE, start_time, end_time) AS diff_in_minutes -- Sự khác biệt theo phút
FROM 
    events
WHERE 
    TIMESTAMPDIFF(MINUTE, start_time, end_time) >= 30; -- end_time lớn hơn start_time ít nhất 30 phút
 

Giải thích:

  1. WHERE TIMESTAMPDIFF(MINUTE, start_time, end_time) >= 30:

    • Điều kiện này đảm bảo rằng khoảng thời gian giữa start_timeend_time phải dài hơn hoặc bằng 30 phút.
  2. Các cột trả về:

    • diff_in_days: Chênh lệch giữa hai mốc thời gian theo ngày.
    • diff_in_hours: Chênh lệch theo giờ.
    • diff_in_minutes: Chênh lệch theo phút.
  3. Đơn vị MINUTE trong TIMESTAMPDIFF:

    • Sử dụng MINUTE để tính trực tiếp số phút chênh lệch mà không cần chuyển đổi từ giờ hoặc giây.

Lưu ý:

Nếu bạn có thêm yêu cầu cụ thể khác như sắp xếp các kết quả theo thời gian chênh lệch lớn nhất hoặc lọc thêm điều kiện, bạn có thể mở rộng thêm:

SELECT 
    event_id,
    TIMESTAMPDIFF(DAY, start_time, end_time) AS diff_in_days,
    TIMESTAMPDIFF(HOUR, start_time, end_time) AS diff_in_hours,
    TIMESTAMPDIFF(MINUTE, start_time, end_time) AS diff_in_minutes
FROM 
    events
WHERE 
    TIMESTAMPDIFF(MINUTE, start_time, end_time) >= 30
ORDER BY 
    diff_in_minutes DESC; -- Sắp xếp theo số phút chênh lệch giảm dần
 
About the Author

Tin liên quan