Điều kiện GIỮA MySQL được sử dụng để truy xuất các giá trị trong một phạm vi trong câu lệnh CHỌN, CHÈN, CẬP NHẬT hoặc XÓA
cú pháp
Cú pháp của Điều kiện GIỮA trong MySQL là
expression BETWEEN value1 AND value2;
Tham số hoặc Đối số
cột biểu thức hoặc phép tính. value1 và value2Những giá trị này tạo ra một phạm vi bao hàm mà biểu thức được so sánh vớiGhi chú
- Điều kiện GIỮA MySQL sẽ trả về các bản ghi có biểu thức nằm trong phạm vi giá trị 1 và giá trị 2 [bao gồm]
- Khi sử dụng Điều kiện GIỮA MySQL với ngày tháng, hãy đảm bảo sử dụng hàm CAST để chuyển đổi rõ ràng các giá trị thành ngày tháng
Ví dụ - Với số
Hãy xem xét một số ví dụ về điều kiện GIỮA MySQL bằng cách sử dụng các giá trị số. Ví dụ số sau đây sử dụng điều kiện GIỮA để truy xuất các giá trị trong một phạm vi số
Ví dụ
SELECT * FROM contacts WHERE contact_id BETWEEN 100 AND 200;
Ví dụ MySQL GIỮA này sẽ trả về tất cả các hàng từ bảng nhà cung cấp trong đó nhà cung cấp KHÔNG nằm trong khoảng từ năm 2000 đến 2999, bao gồm cả. Nó sẽ tương đương với câu lệnh SELECT sau
Hôm nọ, tôi phải nhanh chóng lấy một số thống kê từ bảng cơ sở dữ liệu. Tôi cần xác định thời gian trung bình để chạy các công việc trong hệ thống xếp hàng. Để làm được điều này, tôi đã sử dụng các phương pháp chênh lệch múi giờ của MySQL. Tôi nghĩ rằng tôi sẽ chia sẻ cách các phương pháp này hoạt động và cách tôi triển khai chúng
Để tính toán sự khác biệt giữa hai ngày, MySQL cung cấp cho chúng tôi hai phương pháp khác nhau. TIMESTAMPDIFF
và TIMEDIFF
. Cái bạn sử dụng tùy thuộc vào cách bạn muốn định dạng sự khác biệt kết quả
DẤU THỜI GIAN
Phương thức này trả về chênh lệch giữa hai ngày theo đơn vị được cung cấp làm tham số đầu tiên. Ví dụ: nếu chúng tôi muốn biết sự khác biệt giữa hai ngày tính bằng giây
SELECT id, job, TIMESTAMPDIFF[SECOND, start_date, end_date] AS runtime
FROM example_table;
Điều này tính toán end_date - start_date
trong vài giây
Các đơn vị có thể là bất kỳ một trong những điều sau đây. FRAC_SECOND [micro giây], GIÂY, PHÚT, GIỜ, NGÀY, TUẦN, THÁNG, QUÝ hoặc NĂM
Ngày được truyền cho phương thức này không cần phải cùng loại. Một cái có thể là DATETIME và cái kia là NGÀY. Nếu cột có loại NGÀY thì nó sẽ được coi là có thời gian nửa đêm
TIMEDIFF
Phương thức này trả về sự khác biệt giữa hai ngày được định dạng là hours:minutes:seconds.microseconds
SELECT id, job, TIMEDIFF[end_date, start_date] AS runtime
FROM example_table;
Giống như TIMESTAMPDIFF
, điều này tính toán end_date - start_date
, nhưng lưu ý rằng các tham số ngày được gọi theo thứ tự ngược lại
Không giống như TIMESTAMPDIFF
, cả hai ngày cần phải cùng loại
Một ví dụ thực tế
Bây giờ chúng ta đã thiết lập cách sử dụng các phương thức chênh lệch múi giờ của MySQL, hãy xem xét một trường hợp sử dụng thực tế
Như tôi đã đề cập lúc đầu, tôi cần kiểm tra xem hàng đợi của mình mất bao lâu để xử lý công việc. Tôi có một bảng queued_t task chứa thông tin chi tiết về các tác vụ nền. Sử dụng TIMEDIFF
tôi đã có thể xác định các công việc chạy dài nhất và ngắn nhất trong tháng trước
SELECT MAX[TIMEDIFF[completed, fetched]] AS max_runtime, MIN[TIMEDIFF[completed, fetched]] AS min_runtime
FROM queue
WHERE completed IS NOT NULL AND created > NOW[] - INTERVAL 1 MONTH;
Điều này đã cho tôi phạm vi thời gian chạy cho hàng đợi của tôi
Sau đó, tôi có thể sử dụng TIMESTAMPDIFF
để tính thời gian trung bình, sử dụng phạm vi tôi vừa tính để chọn một đơn vị thời gian thích hợp
Ví dụ
Trả về sự khác biệt giữa hai biểu thức thời gian
CHỌN TIMEDIFF["13. 10. 11", "13. 10. 10"];
Định nghĩa và cách sử dụng
Hàm TIMEDIFF[] trả về sự khác biệt giữa hai biểu thức thời gian/ngày giờ
Ghi chú. time1 và time2 phải có cùng định dạng và phép tính là time1 - time2
cú pháp
Giá trị tham số
Tham sốMô tảthời gian1Bắt buộc. Một giá trị thời giantime2Required. Giá trị thời gian khácchi tiết kỹ thuật
Thêm ví dụ
Ví dụ
Trả về sự khác biệt giữa hai biểu thức ngày giờ
CHỌN TIMEDIFF["25-06-2017 13. 10. 11", "2017-06-15 13. 10. 10"];
Tự mình thử »Trong bảng travel
, có ba cột. id
, departure
và arrival
. Bạn muốn tính toán sự khác biệt giữa arrival
và departure
Bảng travel
trông như thế này
Giải pháp 1 [chênh lệch về ngày, giờ, phút hoặc giây]
SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS difference FROM travel;
Kết quả là
idkhởi hànhđếnsự khác biệt12018-03-25 12. 00. 002018-04-05 07. 30. 0093420022019-09-12 15. 50. 002019-10-23 10. 30. 30352323032018-07-14 16. 15. 002018-07-14 20. 40. 301593042018-01-05 08. 35. 002019-01-08 14. 00. 0031814700Thảo luận
Để tính toán sự khác biệt giữa các dấu thời gian trong MySQL, hãy sử dụng hàm. Đối số đơn vị có thể là
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;2,
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;3,
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;4,
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;5,
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;6,
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;7,
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;8,
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;9 hoặc
CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference0. Để có sự khác biệt tính bằng giây như chúng ta đã làm ở đây, hãy chọn
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;3. Để có được sự khác biệt trong vài phút, hãy chọn
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;4; . Các đối số kết thúc và bắt đầu lần lượt là dấu thời gian kết thúc và dấu thời gian bắt đầu [ở đây,
departure
và arrival
, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference6]
Giải pháp 2 [sự khác biệt về ngày, giờ, phút và giây]
WITH difference_in_seconds AS [ SELECT id, departure, arrival, TIMESTAMPDIFF[SECOND, departure, arrival] AS seconds FROM travel ], differences AS [ SELECT id, departure, arrival, seconds, MOD[seconds, 60] AS seconds_part, MOD[seconds, 3600] AS minutes_part, MOD[seconds, 3600 * 24] AS hours_part FROM difference_in_seconds ] SELECT id, departure, arrival, CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference FROM differences;
Kết quả là
Thảo luận
Đầu tiên, tính toán sự khác biệt giữa các dấu thời gian tính bằng giây, sử dụng hàm
CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference7 [CTE đầu tiên, có tên là
CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference8], giống như trong Giải pháp 1. Tính xem có bao nhiêu giây vượt quá cả phút [_______14_______9] để sau này tính giây, bao nhiêu giây vượt quá cả giờ [
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds0] sau này sẽ dùng để tính phút và bao nhiêu giây ở đó
Để làm điều này, hãy sử dụng hàm
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds2. Ví dụ: một giờ có 3600 giây, vì vậy để biết có bao nhiêu giây trong
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds0, hãy tìm phần còn lại từ phép chia cho 3600 như sau
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds4
Tương tự, có
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds5 giây trong một ngày, vì vậy để tính xem có bao nhiêu giây trong
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds1, hãy viết
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds7
Khi những phần còn lại này được tính toán [trong CTE thứ hai, có tên là
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds8], cuối cùng bạn có thể nhận được sự khác biệt về ngày, giờ, phút và giây. Để có được số giây, phút, giờ và ngày, hãy chia số giây trong phần còn lại cho số giây tương ứng trong ngày, giờ hoặc phút. Ví dụ: để biết số phút sẽ được hiển thị, hãy lấy
FLOOR[seconds / 3600 / 24] AS days, FLOOR[hours_part / 3600] AS hours, FLOOR[minutes_part / 60] AS minutes, seconds_part AS seconds0 và chia cho 60, vì có 60 phút trong một giờ. Bạn chỉ cần phần nguyên từ cái này [i. e. , không có phần thập phân], vì vậy hãy sử dụng hàm FLOOR[] như thế này
travel
0
Cuối cùng, bạn chỉ cần hiển thị trong một chuỗi những gì bạn đã tính toán. Để thực hiện việc này, hãy sử dụng hàm travel
1 trong truy vấn bên ngoài
CONCAT[ FLOOR[seconds / 3600 / 24], ' days ', FLOOR[hours_part / 3600], ' hours ', FLOOR[minutes_part / 60], ' minutes ', seconds_part, ' seconds' ] AS difference
Giải pháp được trình bày ở đây trả về cột cuối cùng dưới dạng văn bản. Bạn có thể dễ dàng sửa đổi giải pháp này để hiển thị nó ở một số định dạng khác. Bạn cũng có thể hiển thị các số trong các cột riêng biệt, như thế này