2012-12-31 31 views
80

Tôi có một bảng có chứa cột ngày giờ. Tôi muốn trả lại tất 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 hồ sơ sau, thì chỉ có 2 và 3 sẽ được trả lại nếu tôi giới hạn đến 2012-12-25.CHỌN LỰA CHỌN Ngày giờ khớp với ngày (và không nhất thiết là thời gian)

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

Xem câu trả lời của John Woo tại http://stackoverflow.com/questions/14769026/mysql-select-where-timestamp-today – ekerner

Trả lời

217

NEVER EVER sử dụng một selector như DATE(datecolumns) = '2012-12-24' - đó là một kẻ giết người thực hiện:

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

Nó được 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.

EDIT

Như đã chỉ ra bởi Used_By_Already, trong thời gian kể từ khi câu trả lời inital vào năm 2012, đã có xuất hiện các phiên bản của MySQL, nơi sử dụng '23: 59: 59' như một kết thúc ngày không còn an toàn. Phiên bản cập nhật phải đọ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à tránh bộ chọn trên biểu thức được tính toán, tất nhiên vẫn là viết tắt.

+0

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

+2

Chỉ cần thử nghiệm trên hai máy chủ ở trên là MUCH (10x ít nhất) nhanh hơn ngày() = '' đặc biệt cho các bảng lớn. Cảm ơn – zzapper

+0

Không đủ để nói * và 2012-12-26 *? Ngày được tự động giả định là tại thời điểm 0 (tức là 00: 00: 00.000) và giới hạn trên là độc quyền. Hay tôi chỉ đang bối rối? –

25

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26' có khả năng có thể làm việc tốt hơn (nếu bạn có một chỉ mục trên date_column) so với DATE.

+1

Tôi thực sự băn khoăn là nhanh hơn - giải pháp này hoặc giải pháp 'BETWEEN' ... bất kỳ ai đã đánh dấu? –

+4

Nó không phải là bất kỳ sự khác biệt. 'BETWEEN' chỉ là một cách để viết' field> = value1 và 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 giá trị ngày hoặc thời gian, hãy sử dụng CAST() để chuyển đổi một cách rõ ràng các giá trị sang kiểu dữ liệu mong muốn. chuyển đổi giá trị DATE thành 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 truyền chuỗi đó thành DATE. " Vì vậy, trừ khi chúng thuộc cùng một loại, tốt nhất là nên truyền chúng một cách rõ ràng. – techdude

14

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

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

LIKE dường như chậm như DATE (datetimecol). Sử dụng tốt hơn dung dịch của Eugen hoặc a1ex07. –

Các vấn đề liên quan