2013-07-24 45 views
8

Chạy tuyên bố sau, MySQL dường như trộn mọi thứ lên:ngày và thời gian của datetime Bắt (? Lỗi trong MySQL)

select now(), if(false, date(now()), time(now())); 

| 2013-07-24 10:06:21 | 2010-06-21 00:00:00 | 

Nếu thay thế đối số thứ hai của if với một chuỗi chữ, báo cáo kết quả xử chính xác:

select now(), if(false, 'Banana', time(now())); 

| 2013-07-24 10:06:21 | 10:06:21 | 

Đây có phải là lỗi hoặc một số điều kỳ quặc thực sự lạ?

+0

'CHỌN '2013-07-24 10:06:21', NẾU (FALSE, DATE ('2013-07-24 10:06:21'), TIME ('2013-07-24 10:06: 21 ')); 'cho thấy cùng một hành vi (do đó, bây giờ() không liên quan) –

+0

thay vào đó,' CHỌN' 2013-07-24 10:06:21 ', NẾU (TRUE, DATE (' 2013-07- 24 10:06:21 '), TIME (' 2013-07-24 10:06:21 ')); 'hoạt động đúng như mong đợi –

Trả lời

4

Loại trả về IF phải là kiểu dữ liệu bao gồm các loại của cả hai đối số. Vì vậy, nếu một trong các đối số là DATE và một đối số khác là TIME, loại IF sẽ là DATETIME.

này dường như không cần thiết trong truy vấn Ví dụ tầm thường, nhưng hãy cân nhắc cái gì đó như:

SELECT IF(col1, date(col2), time(col2)) AS dt 
FROM Table 

Tất cả các hàng của kết quả phải có kiểu dữ liệu tương tự trong cột dt, mặc dù các dữ liệu cụ thể sẽ phụ thuộc vào những gì trong hàng đó.

Nếu bạn muốn chỉ ngày hoặc giờ, hãy chuyển đổi ngày hoặc giờ thành chuỗi.

+0

Có, bạn phải đúng. Cần phải có một loại xác định cho cột. Vậy cách tốt nhất để khắc phục điều này là gì? Điều tôi muốn làm là: 'select if (được tạo forthrin

+0

Tôi giải thích làm thế nào để làm điều đó trong dòng cuối cùng của câu trả lời của tôi, bạn có cần nó đánh vần? – Barmar

+0

Không cần thái độ. OK, vì vậy 'if (true, cast (date (now()) là char), cast (time (now()) là char))'. – forthrin

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