MySQL CHỌN datetime phù hợp với ngày (và không nhất thiết là thời gian)


127

Tôi có một bảng chứa cột datetime. Tôi muốn trả lại tất cả các hồ sơ của một ngày nhất định bất kể thời gian. Hay nói cách khác, nếu bảng của tôi chỉ chứa 4 bản ghi sau, thì chỉ có thứ 2 và thứ 3 sẽ được trả về nếu tôi giới hạn ở 2012-12-25.

2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00

Xem câu trả lời của John Woo tại stackoverflow.com/questions/14769026/ từ
ekerner

Câu trả lời:


326

KHÔNG BAO GIỜ sử dụng bộ chọn như DATE(datecolumns) = '2012-12-24'- nó là một kẻ giết người hiệu suất:

  • nó sẽ tính toán DATE()cho tất cả các hàng, kể cả những hàng không khớp
  • nó sẽ làm cho không thể sử dụng một chỉ mục cho truy vấn

Nó nhanh hơn nhiều để sử dụng

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'

vì điều này sẽ cho phép sử dụng chỉ mục mà không cần tính toán.

BIÊN TẬP

Như được sử dụng bởi used_By_Al yet, trong thời gian kể từ câu trả lời bẩm sinh năm 2012, đã xuất hiện các phiên bản MySQL, trong đó sử dụng '23: 59: 59 'khi kết thúc một ngày không còn an toàn. Một phiên bản cập nhật nên đọc

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'

Ý chính của câu trả lời, tức là việc tránh bộ chọn trên biểu thức tính toán, tất nhiên vẫn đứng vững.


Tôi đã nhận xét rằng giải pháp của a1ex07 dường như không tốt như những giải pháp khác. Sau khi đọc bài viết của bạn, có lẽ tôi cần đảo ngược suy nghĩ của mình!
dùng1032531

2
Chỉ cần thử nghiệm trên hai máy chủ ở trên là NHIỀU (ít nhất là 10 lần) nhanh hơn ngày () = '' đặc biệt đối với các bảng lớn. Cảm ơn
zzapper

1
@KonradViltersten Tôi đã sử dụng một cách rất dài dòng để diễn đạt các truy vấn để làm cho nó dễ đọc hơn và lái xe về nhà theo quan điểm của tôi, không phải là tinh chỉnh nó. Câu trả lời của a1ex07 có cú pháp thưa thớt.
Eugen Rieck

9
@KonradViltersten - Tốt hơn nữa : WHERE col >= '2012-12-25' AND col < '2012-12-25' + INTERVAL 1 DAY. Nó tránh được 0 thời gian và làm việc cho DATE, DATETIME, DATETIME(6), vv Và thỏa thuận với bước nhảy vọt-ngày, vv
Rick James

1
'2012-12-25 23:59:59' KHÔNG CÓ GIÁ TRỊ như là một ngày cuối cùng, nó luôn là một ý tưởng tồi và nó sẽ gây ra lỗi cho các phiên bản MySQL hỗ trợ độ chính xác của thời gian thứ hai. Tốt hơn nhiều để sử dụng cách tiếp cận của Rick James (ở trên) hoặc a1ex07 (câu trả lời khác)
Được sử dụng_By_Al yet

34

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'có khả năng hoạt động tốt hơn (nếu bạn có một chỉ mục trên date_column) hơn DATE.


1
Tôi thực sự tự hỏi cái gì nhanh hơn - cái này hay BETWEENgiải pháp ... có ai bị đánh dấu không?
jave.web

6
Nó không nên là bất kỳ sự khác biệt. BETWEENchỉ là một cách để viết field >= value1 and fied<= value2.
a1ex07

1
Lưu ý rằng theo Hướng dẫn sử dụng MySQL: "Để có kết quả tốt nhất khi sử dụng GIỮA với các giá trị ngày hoặc thời gian, hãy sử dụng CAST () để chuyển đổi rõ ràng các giá trị thành loại dữ liệu mong muốn. Ví dụ: Nếu bạn so sánh DATETIME với hai giá trị DATE, hãy chuyển đổi DATE các giá trị thành các giá trị DATETIME. Nếu bạn sử dụng hằng số chuỗi, chẳng hạn như '2001-1-1' so với DATE, hãy chuyển chuỗi thành DATE. " Vì vậy, trừ khi tất cả chúng đều cùng loại, tốt nhất là nên đúc chúng một cách rõ ràng.
techdude

21

Bạn có thể sử dụng %:

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'

13
THÍCH dường như chậm như DATE (datetimecol). Sử dụng tốt hơn giải pháp của Eugen hoặc a1ex07.
Marie Fischer

3
Không phải lúc nào cũng là về tốc độ. Vì vậy, tôi thích giải pháp này. Nó dễ đọc hơn nhiều.
Simon Hansen
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.