validar una rango por para mes hacer generar funcion fechas entre consulta comparar como busqueda buscar mysql datetime date-arithmetic

una - MySQL: intervalo medio entre registros



hacer una busqueda por fechas en php (4)

Supongamos esta tabla:

id date ---------------- 1 2010-12-12 2 2010-12-13 3 2010-12-18 4 2010-12-22 5 2010-12-23

¿Cómo puedo encontrar los intervalos promedio entre estas fechas, usando solo las consultas de MySQL?

Por ejemplo, el cálculo en esta tabla será

( ( 2010-12-13 - 2010-12-12 ) + ( 2010-12-18 - 2010-12-13 ) + ( 2010-12-22 - 2010-12-18 ) + ( 2010-12-23 - 2010-12-22 ) ) / 4 ---------------------------------- = ( 1 DAY + 5 DAY + 4 DAY + 1 DAY ) / 4 = 2.75 DAY


Intuitivamente, lo que pide debe ser equivalente al intervalo entre la primera y la última fecha, dividido por el número de fechas menos 1.

Déjame explicarte más a fondo. Imagine que las fechas son puntos en una línea ( + son fechas presentes, - faltan fechas, la primera fecha es la 12 y cambié la última fecha al 24 de diciembre para fines de ilustración):

++----+---+-+

Ahora, lo que realmente quieres hacer es espaciar las fechas entre estas líneas y encontrar cuánto tiempo hay entre cada una de ellas:

+--+--+--+--+

Para hacer eso, simplemente toma el número de días entre el último y el primer día, en este caso 24 - 12 = 12, y divídelo por el número de intervalos que debes espaciar, en este caso 4: 12 / 4 = 3 .

Con una consulta de MySQL

SELECT DATEDIFF(MAX(dt), MIN(dt)) / (COUNT(dt) - 1) FROM a;

Esto funciona en esta tabla (con sus valores devuelve 2.75):

CREATE TABLE IF NOT EXISTS `a` ( `dt` date NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; INSERT INTO `a` (`dt`) VALUES (''2010-12-12''), (''2010-12-13''), (''2010-12-18''), (''2010-12-22''), (''2010-12-24'');


La siguiente consulta devuelve el resultado correcto

SELECT AVG( DATEDIFF(i.date, (SELECT MAX(date) FROM intervals WHERE date < i.date) ) ) FROM intervals i

pero ejecuta una subconsulta dependiente que puede ser realmente ineficiente sin índice y en un número mayor de filas.


Necesitas hacer una auto-unión y obtener diferencias usando la función DATEDIFF y obtener el promedio.


Si los identificadores se incrementan de manera uniforme sin espacios, unir la tabla a sí misma en id + 1:

SELECT d.id, d.date, n.date, datediff(d.date, n.date) FROM dates d JOIN dates n ON(n.id = d.id + 1)

Luego GRUPO POR y media según sea necesario.

Si los identificadores no son uniformes, primero realice una consulta interna para asignar los identificadores ordenados.

Supongo que también deberá agregar una subconsulta para obtener el número total de filas.

Alternativamente

Cree una función agregada que haga un seguimiento de la fecha anterior, y una suma y cuenta corriente. Aún tendrá que seleccionar de una subconsulta para forzar el pedido por fecha (en realidad, no estoy seguro de si eso está garantizado en MySQL).

Ahora que lo pienso, esta es una forma mucho mejor de hacerlo.

E incluso mas sencillo

Solo teniendo en cuenta que la solución de Vegard es mucho mejor.