2011-10-28 8 views
7

Tengo que comparar los resultados relativos al mismo tiempo entre dos tablas, pero las marcas de tiempo difieren de un segundo debido a cómo fueron grabadas. Me gustaría obtener un resultado como en Ejemplo 1 pero obtengo solo los valores con el asterisco, como en Ejemplo 2. ¿Cuál es la mejor manera de eliminar los segundos de la comparación o seleccionar el valor correspondiente al valor DATETIME más cercano?MySQL seleccione DATETIME similar al minuto

Actualmente estoy usando esta consulta:

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 

Cualquier sugerencia sobre la mejor práctica muy bien acogido.


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

Respuesta

10

Esta expresión MySql le va a devolver valores DATETIME con los segundos llevado a cero.

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

Echa un vistazo a esto. http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format. Por lo que podría terminar con una consulta como esta:

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

Pero, tenga cuidado. Las marcas de tiempo generadas automáticamente son como números flotantes; cuando dos de ellos aparecen iguales el uno al otro es solo suerte. Puede ser correcto truncar sus marcas de tiempo al minuto, pero también puede ser mejor restar una marca de tiempo de otra y comparar las diferencias (o los valores absolutos de las diferencias).

Además, esta unión va a ser lenta porque tiene que ejecutar la función de segundo truncamiento en cada valor, por lo que no puede usar ningún índice.

Puede restar una marca de tiempo de otra con TIMESTAMPDIFF(). Pero ten cuidado. Esta función solo funciona correctamente al nivel de segundos para las marcas de tiempo dentro de unos días el uno del otro; se desborda sin gracia (como descubrí con gran dolor).

Puede intentar truncar las marcas de tiempo en minutos al momento de insertarlas. Eso te permitiría indexarlos.

+0

Gracias, TIMESTAMPDIFF hace el trabajo. a veces obtengo entradas dobles y quitarlas lleva mucho tiempo.Voy a probar si la conversión de la fecha es más rápida en este caso. –

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

donde threshold es el número de segundos después del cual ya no desea un partido (por ejemplo, 60 por 1 minuto).

+0

Lo intenté pero lleva demasiado tiempo, hasta Error 2013 –

1

Usted podría utilizar TIMESTAMPDIFF para calcular la diferencia en datetimes en segundos:

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

Observando Ollie Jones warning, he probado TIMESTAMPDIFF en MySQL versión 5.1.58 y no encontró desbordamiento con marcas de tiempo que difieren en hasta al menos 10000 años. Entonces tal vez este problema ha sido arreglado.