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
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:
-
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.
-
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.
-
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.)
-
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.
-
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.
-
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:
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.TIMESTAMPDIFF(HOUR, start_time, end_time)
: Tính sự khác biệt theo giờ.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_time
và end_time
dưới dạng số ngày, giờ, và phút.
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:
-
WHERE TIMESTAMPDIFF(DAY, start_time, end_time) >= 1
:- Điều kiện này đảm bảo rằng
end_time
phải cáchstart_time
ít nhất 1 ngày (tương đương với 24 giờ).
- Điều kiện này đảm bảo rằng
-
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ầnWHERE
.
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:
-
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ơnstart_time
ít nhất 4 giờ.
- Điều kiện này đảm bảo rằng
-
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.
- Hàm này trả về chênh lệch giữa hai mốc thời gian theo đơn vị giờ (
-
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:
-
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_time
vàend_time
phải dài hơn hoặc bằng 30 phút.
- Điều kiện này đảm bảo rằng khoảng thời gian giữa
-
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.
-
Đơn vị
MINUTE
trongTIMESTAMPDIFF
:- 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.
- Sử dụng
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