Làm cách nào để kiểm tra giữa các ngày trong MySQL?

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. TIMESTAMPDIFFTIMEDIFF. 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

Toán tử

SELECT id, job, TIMEDIFF(end_date, start_date) AS runtime
    FROM example_table;
2 chọn các giá trị trong một phạm vi nhất định. Các giá trị có thể là số, văn bản hoặc ngày tháng

Toán tử

SELECT id, job, TIMEDIFF(end_date, start_date) AS runtime
    FROM example_table;
2 bao hàm. giá trị bắt đầu và kết thúc được bao gồm.  

Cú pháp GIỮA

CHỌN(các) tên_cột
TỪ_tên_bảng
Ở ĐÂU tên_cột GIỮA value1 VÀ value2;


Cơ sở dữ liệu demo

Dưới đây là một lựa chọn từ bảng "Sản phẩm" trong cơ sở dữ liệu mẫu của Northwind

Sản phẩmIDSản phẩmTênNhà cung cấpIDDanh mụcIDUnitGiá1Chais1110 hộp x 20 túi182Chang1124 - chai 12 oz193Aniseed Syrup1212 - chai 550 ml104Gia vị Chef Anton's Cajun1248 - lọ 6 oz225Chef Anton's Gumbo Mix1236 hộp21. 35


GIỮA Ví dụ

Câu lệnh SQL sau đây chọn tất cả các sản phẩm có giá từ 10 đến 20



KHÔNG GIỮA Ví dụ

Để hiển thị các sản phẩm nằm ngoài phạm vi của ví dụ trước, hãy sử dụng

SELECT id, job, TIMEDIFF(end_date, start_date) AS runtime
    FROM example_table;
4


GIỮA với IN Ví dụ

Câu lệnh SQL sau đây chọn tất cả các sản phẩm có giá từ 10 đến 20. Thêm vao Đoa;

Ví dụ

CHỌN * TỪ Sản phẩm
Ở ĐÂU Giá GIỮA 10 VÀ 20
VÀ ID danh mục KHÔNG CÓ TRONG (1,2,3);

Tự mình thử »


GIỮA Giá trị văn bản Ví dụ

Câu lệnh SQL sau đây chọn tất cả các sản phẩm có ProductName nằm giữa Carnarvon Tigers và Mozzarella di Giovanni

Ví dụ

CHỌN * TỪ SẢN PHẨM
Ở ĐÂU Tên sản phẩm GIỮA 'Carnarvon Tigers' VÀ 'Mozzarella di Giovanni'
ĐẶT HÀNG THEO Tên sản phẩm;

Tự mình thử »

Câu lệnh SQL sau đây chọn tất cả các sản phẩm có ProductName nằm giữa Carnarvon Tigers và Chef Anton's Cajun Seasoning

Ví dụ

CHỌN * TỪ SẢN PHẨM
Ở ĐÂU Tên sản phẩm GIỮA "Carnarvon Tigers" VÀ "Gia vị Cajun của Chef Anton"
ĐẶT HÀNG THEO Tên sản phẩm;

Tự mình thử »


KHÔNG GIỮA Giá trị văn bản Ví dụ

Câu lệnh SQL sau đây chọn tất cả các sản phẩm có ProductName không nằm giữa Carnarvon Tigers và Mozzarella di Giovanni

Ví dụ

CHỌN * TỪ SẢN PHẨM
Ở ĐÂU Tên sản phẩm KHÔNG GIỮA 'Carnarvon Tigers' VÀ 'Mozzarella di Giovanni'
ĐẶT HÀNG THEO Tên sản phẩm;

Tự mình thử »


Bảng mẫu

Dưới đây là một lựa chọn từ bảng "Đơn hàng" trong cơ sở dữ liệu mẫu của Northwind

OrderIDCustomerIDEemployeeIDOrderDateShipperID102489057/4/19963102498167/5/19961102503447/8/19962102518437/9/19961102527647/10/19962


GIỮA NGÀY Ví dụ

Câu lệnh SQL sau đây chọn tất cả các đơn đặt hàng có OrderDate trong khoảng từ '01- July-1996' đến '31- July-1996'

Ví dụ

CHỌN * TỪ ĐƠN HÀNG
WHERE OrderDate GIỮA #07/01/1996# VÀ #07/31/1996#;

Tự mình thử »

HOẶC

Ví dụ

CHỌN * TỪ ĐƠN HÀNG
WHERE OrderDate GIỮA '1996-07-01' AND '1996-07-31';

Tự mình thử »


Kiểm tra bản thân với các bài tập

Tập thể dục

Sử dụng toán tử

SELECT id, job, TIMEDIFF(end_date, start_date) AS runtime
    FROM example_table;
2 để chọn tất cả các bản ghi có giá trị của cột
SELECT id, job, TIMEDIFF(end_date, start_date) AS runtime
    FROM example_table;
6 nằm trong khoảng từ 10 đến 20