Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Comparando fechas

Estas en el tema de Comparando fechas en el foro de Mysql en Foros del Web. Tengo una tabla creada en mi hosting phpMyAdmin llamada: programacion_de_actuaciones tiene un campo date, quiero hacer un query que filtre solo las 4 proximas tareas ...
  #1 (permalink)  
Antiguo 19/07/2010, 08:33
 
Fecha de Ingreso: noviembre-2004
Mensajes: 133
Antigüedad: 19 años, 5 meses
Puntos: 0
Exclamación Comparando fechas

Tengo una tabla creada en mi hosting phpMyAdmin llamada: programacion_de_actuaciones tiene un campo date, quiero hacer un query que filtre solo las 4 proximas tareas programadas a la fecha actual, es decir:

Si hoy es dia 19/07 y en la tabla aparecen campos con la fecha de hoy (19/07)quiero que los muestre (puede ser uno o varios para la misma fecha)y los correspondientes a las dias siguientes al 19/07, solo quiero que muestre 4 resultados...ahora aqui mi problema puede ser que solo haya dos actos posteriores al dia actual, entonces querria que mostrase, los 2 anteriores a la fecha y los dos posteriores, en pantalla siempre tiene que haber 4 resultados y eses tienen que ser los mas proximos a la fecha actual.

Mediante php meto en una variable la fecha_actual bien, ahora puedo hacer un query comparando esta fecha con las fechas de la tabla y filtrar las que sean iguales o superiores, guardar en una varible el numero de filas del resultado para saber cuantos resultados obtuve y asi poder saber si hay mas de 4 o menos....hasta aqui creo que lo se hacer, lo logico ahora seria hacer otro query comparando las fechas y buscando justo las dos anteriores a la fecha_actual, no se bien como se hace este tipo de comporaciones pero eso no creo que me resulte muy complicado (eso espero, si alguien me lo explica seria ya....como el gol de iniesta je..)y tampoco se si este metodo es el mejor y mas rapido, creo que debe haber alguna manera de hacerlo todo en una consulta y que se mas facil.

Gracias!! saludos!!
  #2 (permalink)  
Antiguo 19/07/2010, 10:04
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Comparando fechas

Lo que puedes hacer en php es dinamizar la consultaa, algo parecido a lo que estas haciendo.
La otra es hacer una función en mysql que te haga dicha validación y desde php solo necesitarias llamar la función.

salkudos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 19/07/2010, 13:23
 
Fecha de Ingreso: noviembre-2004
Mensajes: 133
Antigüedad: 19 años, 5 meses
Puntos: 0
Respuesta: Comparando fechas

Como seria una consulta para que me muestre los 2 resultados anteriores a la fecha actual...

Es decir, si tengo la tabla: programacion_actos y dentro de la tabla tengo los siguientes datos:

Acto1 12/07
Acto2 16/07
Acto3 11/07
Acto4 18/08
Acto5 01/08
Acto6 18/03

Y la fecha actual es: 19/07

Como seria el query para que me devuelva, en este caso: Acto1 y Acto2 que son los dos actos que mas se aproximan a la fecha actual sin sobrepasarla...

gracias!
  #4 (permalink)  
Antiguo 19/07/2010, 13:31
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Comparando fechas

Código MySQL:
Ver original
  1. select *from tabla where fecha < now() order by fecha desc limit 2;

asi serían los ultimos 2
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 20/07/2010, 08:34
 
Fecha de Ingreso: noviembre-2004
Mensajes: 133
Antigüedad: 19 años, 5 meses
Puntos: 0
Respuesta: Comparando fechas

Me han dado la soluccion:

SELECT t2.* FROM (SELECT t1.fecha, t1.diferencia as dif, t1.ord2 FROM ((SELECT fecha, DATEDIFF(CURDATE(),fecha) diferencia, 'ant' ord2 FROM `tabla` where fecha < CURDATE() ORDER BY fecha DESC limit 4 )
UNION ALL
(SELECT fecha,DATEDIFF(fecha,CURDATE()), 'post' FROM `tabla` where fecha > CURDATE() order by fecha ASC limit 4))t1 ORDER BY t1.diferencia, ord2 LIMIT 4)t2 ORDER BY t2.fecha

Gracias!!
  #6 (permalink)  
Antiguo 21/07/2010, 01:20
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Comparando fechas

Pongo la explicación que te puse en el otro lugar, por si sirve a alguien:

Una consulta con subconsulta y subconsulta. Creo que no será muy ineficiente, pues me traigo ocho datos y sobre ellos hago las subconsultas. El primer select es para ordenar por fecha...

SELECT t2.* FROM (SELECT t1.fecha, t1.diferencia as dif, t1.ord2 FROM ((SELECT fecha, DATEDIFF(CURDATE(),fecha) diferencia, 'ant' ord2 FROM `tabla` where fecha < CURDATE() ORDER BY fecha DESC limit 4 )
UNION ALL
(SELECT fecha,DATEDIFF(fecha,CURDATE()), 'post' FROM `tabla` where fecha > CURDATE() order by fecha ASC limit 4))t1 ORDER BY t1.diferencia, ord2 LIMIT 4)t2 ORDER BY t2.fecha

Observa que primero me traigo las cuatro fecha anteriores y las cuatro posteriores, con sus diferencias respecto a hoy. Luego las ordeno por la diferencia y corto las cuatro más próximas, sean anteriores o posteriores (uso los alias ant y post porque sirven para ordenar alfabéticamente y son transparentes), pero estableciendo que ordene, primero por la diferencia en tiempo y luego porque sea anterior o posterior; luego limito las 4 primeras, y finalmente ordeno por la fecha para que te salgan seguidas. He puesto la tabla tabla y el campo llamado fecha. Cambia esos nombres por los de tu tabla y campos.
Hay un problema, que haya más de cuatro eventos un mismo día anterior. La consulta te dejaría fuera y no estarías controlando las que dejas fuera. No sé si tienes un campo id que nos sirviera como segunda ordenación...

Etiquetas: comparacion, date, fechas, filtrar, query, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:17.