2011-10-28 27 views
7

Tôi phải comapre các kết quả liên quan đến cùng một thời gian giữa hai bảng, nhưng tem thời gian khác nhau của một số thứ hai vì cách chúng được ghi lại. Tôi muốn có được kết quả như trong Ví dụ 1 nhưng tôi chỉ nhận được các giá trị có dấu sao, như trong Ví dụ 2. Cách tốt nhất để loại bỏ các secods khỏi so sánh, hoặc để chọn giá trị tương ứng với giá trị DATETIME gần nhất là gì?MySQL chọn DATETIME tương tự với số phút

Hiện nay tôi đang sử dụng truy vấn này:

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1, Table2 
    WHERE ... conditions for the other parameters of Table1 and Table2... 
    AND Table1.TimeSTamp1 = Table2.TimeStamp2 

Bất kỳ gợi ý về các thực hành tốt nhất được hoan nghênh nhiệt liệt.


Ví dụ 1

TimeStamp1   ¦ Param1 ¦ TimeStamp2   ¦ Param2 
2011-01-01 00:00:35 ¦ 1  ¦ 2011-01-01 00:00:35 ¦ a  * 
2011-01-01 00:01:35 ¦ 2  ¦ 2011-01-01 00:01:35 ¦ b 
2011-01-01 00:02:37 ¦ 3  ¦ 2011-01-01 00:02:35 ¦ c 
2011-01-01 00:03:31 ¦ 4  ¦ 2011-01-01 00:03:35 ¦ d 
2011-01-01 00:04:32 ¦ 5  ¦ 2011-01-01 00:04:35 ¦ e 
2011-01-01 00:05:38 ¦ 6  ¦ 2011-01-01 00:05:35 ¦ f 
2011-01-01 00:06:36 ¦ 7  ¦ 2011-01-01 00:06:36 ¦ g  * 
2011-01-01 00:07:32 ¦ 8  ¦ 2011-01-01 00:07:35 ¦ h 
2011-01-01 00:08:33 ¦ 9  ¦ 2011-01-01 00:08:35 ¦ i 
2011-01-01 00:09:33 ¦ 10  ¦ 2011-01-01 00:09:33 ¦ l  * 
2011-01-01 00:10:35 ¦ 11  ¦ 2011-01-01 00:10:35 ¦ m  * 
2011-01-01 00:11:29 ¦ 12  ¦ 2011-01-01 00:11:31 ¦ n 

lll Ví dụ 2

TimeStamp1   ¦ Param1 ¦ TimeStamp2   ¦ Param2 
2011-01-01 00:00:35 ¦ 1  ¦ 2011-01-01 00:00:35 ¦ a 
2011-01-01 00:06:36 ¦ 7  ¦ 2011-01-01 00:06:36 ¦ g 
2011-01-01 00:09:33 ¦ 10  ¦ 2011-01-01 00:09:33 ¦ l 
2011-01-01 00:10:35 ¦ 11  ¦ 2011-01-01 00:10:35 ¦ m 

Trả lời

10

biểu MySql này sẽ cho bạn trở lại giá trị DATETIME với giây zeroed ra.

CONVERT(DATE_FORMAT(table.column,'%Y-%m-%d-%H:%i:00'),DATETIME) 

Hãy xem điều này. http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format. Vì vậy, bạn có thể kết thúc với một truy vấn như sau:

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1 
    JOIN Table2 ON CONVERT(DATE_FORMAT(Table1.TimeStamp1,'%Y-%m-%d-%H:%i:00'),DATETIME) 
       = CONVERT(DATE_FORMAT(Table2.TimeStamp2,'%Y-%m-%d-%H:%i:00'),DATETIME) 
    WHERE ... conditions for the other parameters of Table1 and Table2... 

Nhưng, hãy cẩn thận. Các dấu thời gian được tạo tự động giống như các số dấu chấm động; khi hai người trong số họ bật lên bằng nhau thì đó chỉ là may mắn. Việc cắt bớt dấu thời gian của bạn thành phút có thể là OK, nhưng bạn cũng có thể nên trừ đi một dấu thời gian từ một dấu thời gian khác và so sánh các khác biệt (hoặc các giá trị tuyệt đối của sự khác biệt).

Ngoài ra, kết nối này sẽ chậm bởi vì nó phải chạy hàm cắt xén thứ hai trên mọi giá trị, vì vậy nó không thể sử dụng bất kỳ chỉ mục nào.

Bạn có thể trừ một dấu thời gian khỏi một dấu thời gian khác bằng TIMESTAMPDIFF(). Nhưng hãy cẩn thận. Chức năng này chỉ hoạt động chính xác ở cấp độ giây đối với dấu thời gian trong vòng vài ngày của nhau; nó tràn đầy ân hận (như tôi đã phát hiện ra với nỗi đau lớn).

Bạn có thể thử cắt bớt các dấu thời gian thành phút tại thời điểm bạn chèn chúng. Điều đó sẽ cho phép bạn lập chỉ mục cho họ.

+0

Cảm ơn, TIMESTAMPDIFF đã thực hiện công việc. đôi khi tôi nhận được các mục nhập đôi và xóa chúng mất rất nhiều thời gian.Tôi sẽ kiểm tra nếu chuyển đổi ngày là nhanh hơn trong trường hợp này. –

1
WHERE ... 
AND ABS(UNIX_TIMESTAMP(TimeStamp1) - UNIX_TIMESTAMP(TimeStamp2)) < :threshold: 

nơi số threshold là số giây mà bạn không còn muốn so khớp (ví dụ: 60 trong 1 phút).

+0

Tôi đã thử nhưng phải mất quá nhiều thời gian, cho đến khi Lỗi 2013 –

1

Bạn có thể sử dụng TIMESTAMPDIFF để tính toán sự khác biệt trong datetimes trong vài giây:

SELECT t1.TimeStamp1, t1.Param1, t2.TimeStamp2, t2.Param2 
FROM Table1 t1 
LEFT JOIN Table2 t2 
ON ABS(TIMESTAMPDIFF(SECOND,t1.TimeStamp1,t2.TimeStamp2))<=4 
WHERE ... 

Ghi nhận Ollie Jones warning, tôi đã thử nghiệm TIMESTAMPDIFF trên MySQL phiên bản 5.1.58 và không tìm thấy tràn với timestamps khác nhau lên đến ít nhất 10000 năm. Vì vậy, có thể vấn đề này đã được khắc phục.

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