2011-09-10 20 views
6

Quiero calcular la diferencia en los campos de fecha única entre las diferentes filas en la misma tabla.Seleccione la diferencia entre las fechas de fila en MySQL

Por ejemplo, teniendo en cuenta los siguientes datos:

id | date 
    ---+------------ 
    1 | 2011-01-01 
    2 | 2011-01-02 
    3 | 2011-01-15 
    4 | 2011-01-20 
    5 | 2011-01-10 
    6 | 2011-01-30 
    7 | 2011-01-03 

me gustaría para generar una consulta que produce lo siguiente:

id | date  | days_since_last 
---+------------+----------------- 
1 | 2011-01-01 | 
2 | 2011-01-02 | 1 
7 | 2011-01-03 | 1 
5 | 2011-01-10 | 7 
3 | 2011-01-15 | 5 
4 | 2011-01-20 | 5 
6 | 2011-01-30 | 10 

Cualquier sugerencia para lo que las funciones de la fecha que yo usaría en MySQL, o hay una subselección que haría esto?

(Por supuesto, no me importa poner WHERE date > '2011-01-01' hacer caso omiso de la primera fila.)

+0

Esto es donde sería bueno que el análisis de soporte de MySQL, el plomo y el GAL para ser específico ... –

Respuesta

2

Una consulta correlacionada podría ser de ayuda:

SELECT 
    id, 
    date, 
    DATEDIFF(
    (SELECT MAX(date) FROM atable WHERE date < t.date), 
    date 
) AS days_since_last 
FROM atable AS t 
+0

Esto funcionará, lo cual es bueno, pero funcionará como basura debido a la anidación subconsulta (harás "n" escaneos de tabla). La mejor manera sería usar una variable para almacenar el valor de la fecha de la fila anterior después de ordenar por fecha, y hacer solo una pasada. No me molesta en este momento, pero si quieres probar ... :) – Bohemian

+0

Esto es lo que pensé que estaba buscando, pero como dijo Bohemian, el rendimiento duele. Le tomó 28 minutos completarlo (con alrededor de 26,000 filas). Estoy seleccionando esta como la mejor respuesta a mi pregunta, pero por razones de cordura, puede ser mejor usar tablas temporales y seguir la respuesta de Krtek. –

+0

@Mike S .: Estoy sorprendido por dos cosas. Primero, me sorprende que funcionó tan mal en una mesa tan pequeña. Por favor, no me malinterpreten, me doy cuenta de que esta solución puede no ser la más rápida, incluso puede ser bastante inferior a la media, pero 28 minutos en 26.000 filas ... ¿Podría ser que la tabla carece de un índice de 'fecha ¿? De todos modos, otra cosa que me ha sorprendido es que hayas elegido esta respuesta en primer lugar. :) Quiero decir que lo aprecio, gracias, pero créanme, basándome en sus propias palabras, ahora mismo encuentro que la respuesta de Krtek está más cerca de la solución "correcta", sea lo que sea que finalmente resulte. –

0

Algo como esto debería funcionar:

SELECT mytable.id, mytable.date, DATEDIFF(mytable.date, t2.date) 
FROM mytable 
LEFT JOIN mytable AS t2 ON t2.id = table.id - 1 

Sin embargo, esto implica que su id son continuas en su mesa, de lo contrario esto no funcionará en absoluto. Y tal vez MySQL se quejará por la primera fila ya que t2.date será null pero no tengo tiempo para verificarlo ahora.

+0

Me vencieron a la respuesta, por lo que Añadiré mi artículo y le sugiero que eche un vistazo a la documentación: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff – Tchami

+0

@Krtek, gracias Para la respuesta rápida. Tendré que actualizar mi pregunta para reflejar mejor la situación, ya que los identificadores no están en orden cronológico. –

+0

@Tchami - gracias por su voto de confianza. ;) puede estar seguro, sé dónde está la documentación y la consulto con frecuencia. –

Cuestiones relacionadas