Làm thế nào để so sánh ngày dấu thời gian với tham số chỉ ngày trong MySQL?


88

Trong một câu lệnh SQL, làm cách nào để so sánh ngày được lưu dưới dạng TIMESTAMP với ngày ở định dạng YYYY-MM-DD?

Ví dụ.: SELECT * FROM table WHERE timestamp = '2012-05-05'

Tôi muốn truy vấn này trả về tất cả các hàng có dấu thời gian trong ngày được chỉ định, nhưng nó chỉ trả về các hàng có dấu thời gian nửa đêm.

cảm ơn

Câu trả lời:


144

Bạn có thể sử dụng DATE()hàm để trích xuất phần ngày của dấu thời gian:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-05'

Mặc dù vậy, nếu bạn có chỉ mục trên cột dấu thời gian, thì việc này sẽ nhanh hơn vì nó có thể sử dụng chỉ mục trên cột dấu thời gian nếu bạn có:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'

5
Thông qua một thử nghiệm nhỏ mà tôi vừa chạy, tôi thấy sử dụng BETWEEN sẽ nhanh hơn với hệ số 10X Just FYI
DarbyM


6

Theo gợi ý của một số người, bằng cách sử dụng, DATE(timestamp)bạn đang áp dụng thao tác cho cột và do đó bạn không thể dựa vào thứ tự chỉ mục.

Tuy nhiên, việc sử dụng BETWEENsẽ chỉ đáng tin cậy nếu bạn bao gồm phần nghìn giây. Trong dấu thời gian mẫu, BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'bạn loại trừ các bản ghi có dấu thời gian giữa 2012-05-05 23:59:59.0012012-05-05 23:59:59.999. Tuy nhiên, ngay cả phương pháp này cũng có một số vấn đề do độ chính xác của kiểu dữ liệu. Đôi khi 999 mili giây được làm tròn.

Điều tốt nhất để làm là:

SELECT * FROM table
WHERE date>='2012-05-05' AND date<'2012-05-06'

5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'

2

Sử dụng một hàm chuyển đổi của MYSQL:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

Điều này sẽ hoạt động


1

Khi đang nghiên cứu vấn đề này, tôi nghĩ sẽ rất tuyệt nếu sửa đổi giải pháp GIỮA để hiển thị một ví dụ cho một ngày không tĩnh / chuỗi cụ thể, mà là một ngày có thể thay đổi, hoặc ngày hôm nay chẳng hạn CURRENT_DATE(). Điều này SẼ sử dụng chỉ mục trên cột log_timestamp.

SELECT *
FROM some_table
WHERE
    log_timestamp
    BETWEEN 
        timestamp(CURRENT_DATE()) 
    AND # Adds 23.9999999 HRS of seconds to the current date
        timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));

Tôi đã thực hiện tính theo giây / micro giây để tránh trường hợp 12 giờ sáng vào ngày hôm sau. Tuy nhiên, bạn cũng có thể thực hiện INTERVAL '1 DAY' thông qua các toán tử so sánh để có cách tiếp cận KHÔNG GIỮA thân thiện với người đọc hơn:

SELECT *
FROM some_table
WHERE
    log_timestamp >= timestamp(CURRENT_DATE()) AND
    log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));

Cả hai cách tiếp cận này sẽ sử dụng chỉ mục và sẽ hoạt động nhanh hơn NHIỀU. Cả hai dường như đều nhanh như nhau.


0

Trong trường hợp bạn đang sử dụng các tham số SQL để chạy truy vấn thì điều này sẽ hữu ích

SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')

0

Khi tôi đọc câu hỏi của bạn, tôi nghĩ rằng bạn đã ở trên Oracle DB cho đến khi tôi thấy thẻ 'MySQL'. Dù sao, đối với những người làm việc với Oracle, đây là cách:

SELECT *
FROM table
where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.