2010-10-21 28 views
51

Ví dụ truy vấn sau đây hoạt động tốt:mysql datetime so

SELECT * 
    FROM quotes 
WHERE expires_at <= '2010-10-15 10:00:00'; 

Nhưng điều này rõ ràng là thực hiện một 'chuỗi' và so sánh- - Tôi đã tự hỏi nếu có một chức năng tích hợp sẵn trong MySQL mà cụ thể thực hiện 'datetime' so sánh.

Trả lời

104

... Đây rõ ràng là thực hiện một 'chuỗi' so

Không - nếu định dạng ngày/giờ phù hợp với định dạng được hỗ trợ, MySQL thực hiện chuyển đổi ngầm để chuyển đổi các giá trị cho một DATETIME , dựa trên cột mà nó đang được so sánh. Điều tương tự cũng xảy ra với:

WHERE int_column = '1' 

... nơi chuỗi giá trị của "1" được chuyển thành một số nguyên vì kiểu dữ liệu int_column 's là INT, không CHAR/VARCHAR/TEXT.

Nếu bạn muốn chuyển đổi một cách rõ ràng chuỗi đến một DATETIME, các STR_TO_DATE function sẽ là sự lựa chọn tốt nhất:

WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s') 
+7

Nếu máy chủ hoặc các chuỗi của bạn không trong UTC hãy cẩn thận khi chuyển đổi ngầm xảy ra với múi giờ máy chủ/phiên không phải là múi giờ của giá trị mà nó đang được so sánh. Vì vậy, chuỗi là cùng một múi giờ địa phương ngay cả khi bạn so sánh nó với UTC_TIMESTAMP(). – ClearCrescendo

+0

@ClearCrescendo: Điểm tốt, thx. –

18

Nhưng điều này rõ ràng là thực hiện một 'chuỗi' so

số Chuỗi sẽ được tự động đúc thành một giá trị DATETIME.

Xem 11.2. Type Conversion in Expression Evaluation.

Khi một nhà điều hành được sử dụng với toán hạng của các loại khác nhau, loại chuyển đổi xảy ra để làm cho toán hạng tương thích. Một số chuyển đổi xảy ra hoàn toàn. Ví dụ: MySQL tự động chuyển đổi số thành chuỗi nếu cần và ngược lại.

0

Tôi biết nó khá cũ nhưng tôi chỉ gặp vấn đề và đó là những gì tôi nhìn thấy trong Tài liệu SQL:

[Để có kết quả tốt nhất khi sử dụng GIỮA với giá trị ngày hoặc giờ], sử dụng CAST() để chuyển đổi rõ ràng các giá trị sang kiểu 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 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.

tôi giả sử nó tốt hơn để sử dụng STR_TO_DATE kể từ khi họ đã dành thời gian để thực hiện một chức năng chỉ cho điều đó và cũng là thực tế mà tôi thấy điều này trong GIỮA doc ...

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