2012-02-08 16 views
6

Cột d là DATE, cột t là thời gian, cột v là, ví dụ: INT. Giả sử tôi cần tất cả các giá trị được ghi lại sau 15:00 từ ngày 1 tháng 2 năm 2012 trở đi. Nếu tôi viếtLàm thế nào để kết hợp ngày và giờ từ các cột MySQL khác nhau để so sánh với một DateTime đầy đủ?

SELECT * FROM `mytable` WHERE `d` > '2012-02-01' AND `t` > '15:00' 

tất cả các hồ sơ được thực hiện trước 15:00 vào bất kỳ ngày nào sẽ bị loại khỏi tập hợp kết quả (cũng như tất cả được thực hiện vào 2012-02-01) trong khi tôi muốn xem chúng. Dường như nó sẽ dễ dàng nếu có một cột DATETIME duy nhất, nhưng có các cột riêng biệt cho ngày và giờ thay vì trong trường hợp của tôi.

Điều tốt nhất tôi có thể nhìn thấy bây giờ là cái gì đó như

SELECT * FROM `mytable` WHERE `d` >= '2012-02-02' OR (`d` = '2012-02-01' AND `t` > '15:00') 

Bất kỳ tốt hơn ý tưởng? Có lẽ có một chức năng cho điều này trong MySQL? Không có gì giống như

SELECT * FROM `mytable` WHERE DateTime(`d`, `t`) > '2012-02-01 15:00' 

có thể?

Trả lời

14

Bạn có thể sử dụng chức năng mysql CONCAT() thêm hai cột lại với nhau thành một, và sau đó so sánh chúng như thế này:

SELECT * FROM `mytable` WHERE CONCAT(`d`,' ',`t`) > '2012-02-01 15:00' 
+2

Điều này thực sự có nghĩa là để làm việc ok với ngày-thời gian (có nghĩa là không có tổn thất hiệu suất đáng kể và không có hành vi bất ngờ)? – Ivan

+0

Tôi không chắc .. bạn có thể chạy 'giải thích' trên nó, và xem nó hoạt động như thế nào. Tất nhiên, bạn luôn có thể cập nhật hàng loạt bảng của mình để sử dụng một cột ngày giờ thay vì hai cột riêng biệt. –

+0

nếu bạn thực sự muốn có một ngày, bạn có thể sử dụng nó thay vì http://dev.mysql.com/doc/refman/5.5/vi/date-and-time-functions.html # function_str-to-date –

1

Tất cả bạn phải làm là để chuyển đổi nó thành unix timestamp và thực hiện lựa chọn thích hợp . Đối với điều này, bạn phải sử dụng các hàm mysql như * unix_timestamp(). * Và * date_format *

Giả sử bạn muốn chọn các hàng có dấu thời gian> 1328725800, câu lệnh sql sau sẽ thực hiện tác vụ.

select unix_timestamp(d)+3600*date_format(t,'%h)+60*date_format(t,'%i')+date_format(t,'%S') as timestamp from table where timestamp>1328725800 
+0

Nhân tiện, nó không hoạt động theo cách này. Không thể sử dụng bí danh cột ("dấu thời gian" ở đây) trong mệnh đề 'WHERE' - thay vào đó chúng ta phải sử dụng' HAVING'. Và không phải 'date_format (t, '% h)' nhưng 'date_format (t,'% H ')'. Nhưng cảm ơn bạn anyway - truy vấn hoạt động nhanh hơn 200 lần so với truy vấn tôi đã sử dụng làm ví dụ đầu tiên của mình. Mặc dù, giải pháp @ brian-glaz thậm chí còn nhanh hơn. – Ivan

2

Đây là phiên bản sạch sẽ không yêu cầu hoạt động chuỗi hoặc chuyển đổi sang dấu thời gian UTC theo múi giờ.

DATE_ADD(date, INTERVAL time HOUR_SECOND) 
10

Chức năng TIMESTAMP(expr1,expr2) là một cách rõ ràng để kết hợp ngày và thời gian giá trị:

Với một đối số duy nhất, chức năng này sẽ trả về ngày hoặc datetime biểu expr như một giá trị datetime. Với hai đối số, nó thêm biểu thức thời gian expr2 vào ngày hoặc biểu thức ngày giờ expr1 và trả về kết quả dưới dạng giá trị ngày giờ.

sử dụng kết quả này chỉ là những gì bạn dự đoán:

SELECT * FROM `mytable` WHERE TIMESTAMP(`d`, `t`) > '2012-02-01 15:00' 
+0

Điều này thật tuyệt, nhưng bạn cần phải chuyển đổi phần sau> bằng dấu thời gian(). – Maurice

0

Trên thực tế nó nên là:

SELECT * FROM `mytable` WHERE CONCAT(`d`,' ',`t`) > '2012-02-01 15:00:00' 

Nếu bạn muốn mất vài giây vào tài khoản, bạn cần phải thêm hai chữ số để kết thúc;)

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