2011-10-28 9 views
7

Muszę porównać wyniki względem tego samego czasu między dwiema tabelami, ale znaczniki czasu różnią się o kilka sekund ze względu na sposób ich zapisania. Chciałbym uzyskać wynik podobny do tego w Przykład 1, ale otrzymuję tylko wartości z gwiazdką, jak w Przykład 2. Jaki jest najlepszy sposób usunięcia secodów z porównania lub wybrania wartości odpowiadającej najbliższej wartości DATETIME?MySQL wybierz DATETIME podobny do minuty

Obecnie używam tej kwerendy:

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 

Wszelkie sugestie na temat najlepszych praktyk jest ciepło przywitani.


Przykład 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 Przykład 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 

Odpowiedz

10

Wyrażenie mysql oddać wartości daty z sekundy wyzerowany.

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

Spójrz na to. http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format. Możesz więc skończyć się pytaniem:

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... 

Ale bądź ostrożny. Autogenerowane znaczniki czasu przypominają liczby zmiennoprzecinkowe; kiedy dwa z nich stają się sobie równe, to tylko szczęście. Obcinanie znaczników czasu do minuty może być OK, ale możesz także lepiej odjąć jeden znacznik czasu od innego i porównać różnice (lub bezwzględne wartości różnic).

Łączenie to będzie powolne, ponieważ musi uruchomić funkcję drugiego obcinania dla każdej wartości, więc nie może korzystać z żadnych indeksów.

Możesz odjąć jeden znacznik czasu od innego, korzystając z TIMESTAMPDIFF(). Ale bądź ostrożny. Ta funkcja działa poprawnie tylko na poziomie sekund dla znaczników czasu w ciągu kilku dni od siebie; przelewa się gracelessly (jak odkryłem z wielkim bólem).

Możesz spróbować skracać znaczniki czasu do minut w chwili ich wstawiania. To pozwoliłoby ci je zindeksować.

+0

Dzięki, TIMESTAMPDIFF wykonuje pracę. czasami otrzymuję podwójne wpisy, a ich usunięcie zajmuje dużo czasu.Sprawdzę, czy w tym przypadku konwersja daty jest szybsza. –

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

gdzie threshold to liczba sekund, po którym już nie chcą mecz (na przykład 60 przez 1 minutę).

+0

Próbowałem, ale to trwa zbyt długo, aż do Error 2013 –

1

Można użyć TIMESTAMPDIFF obliczyć różnicę datetimes w sekundach:

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 ... 

Zauważając, Ollie Jones warning, Przetestowałem TIMESTAMPDIFF na MySQL w wersji 5.1.58 i nie znalazł przepełnienie ze znaczników czasu różniących się co najmniej 10000 lat. Więc może ten problem został naprawiony.