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

Ayuda con SQL muy complicado!

Estas en el tema de Ayuda con SQL muy complicado! en el foro de Mysql en Foros del Web. Hola! Tengo que hacer una consulta SQL tan complicada que es dificil de explicar, voy a tratar... Tengo una tabla de Eventos que pueden ser ...
  #1 (permalink)  
Antiguo 24/02/2011, 19:50
 
Fecha de Ingreso: febrero-2007
Mensajes: 309
Antigüedad: 17 años, 1 mes
Puntos: 16
Pregunta Ayuda con SQL muy complicado!

Hola!

Tengo que hacer una consulta SQL tan complicada que es dificil de explicar, voy a tratar...

Tengo una tabla de Eventos que pueden ser en una fecha en particular o pueden tener fecha inicio y fecha fin. Ademas algunos eventos con fecha inicio y fecha fin pueden ser unicamente un dia de la semana (o varios) ej: lunes y miercoles.

Entonces tengo:

fecha (date)
fecha_fin (date)
lun (tinyint 1-0)
mar (tinyint 1-0)
mie (tinyint 1-0)
...

El formulario de busqueda tiene los campos: fecha (un calendario para seleccionar una fecha), y otros input para fecha desde y fecha hasta.

El problema es que si yo busco una fecha en particular que es solo un dia de la semana no se como filtrar eso en la consulta sql.
El mismo problema se daria si selecciono un rango de fechas, me va a traer eventos que se realizan entre esas fechas pero que tal vez no caigan por los dias de la semana. Ej: selecciono del 10 al 14 de febrero, y me trae eventos que se realizan entre 5 de enero y 15 de marzo, pero esos eventos se realizan los Lunes, y entre el 10 y 14 de febrero no hay ningun lunes!

Me rompi la cabeza pensando como hacerlo!

Agradecería cualquier ayuda!

Saludos!,
__________________
Responder encuestas
  #2 (permalink)  
Antiguo 25/02/2011, 01:32
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Ayuda con SQL muy complicado!

Si tu haces una query que te traiga eventos del 10 al 14 de Febrero y te trae del 5 de Enero al 15 de Marzo es que tienes un error en la query. A parte que entre el 10 y el 14 de Febrero si hay un Lunes, el propio 14.

¿Que guarda cada campo exactamente? Sobre todos los campos lun, mar, mie...
  #3 (permalink)  
Antiguo 25/02/2011, 07:27
 
Fecha de Ingreso: febrero-2007
Mensajes: 309
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: Ayuda con SQL muy complicado!

Cita:
Iniciado por Heimish2000 Ver Mensaje
Si tu haces una query que te traiga eventos del 10 al 14 de Febrero y te trae del 5 de Enero al 15 de Marzo es que tienes un error en la query. A parte que entre el 10 y el 14 de Febrero si hay un Lunes, el propio 14.

¿Que guarda cada campo exactamente? Sobre todos los campos lun, mar, mie...
10 al 14 de febrero esta entre 5 de enero y 15 de marzo, por eso los trae, lo cual es correcto. Que el lunes 14 de feb de este año cayera lunes no tiene nada que ver, es solo un ejemplo, no dije que fuera de este año, era solo para el ejemplo. gracias igual.
__________________
Responder encuestas
  #4 (permalink)  
Antiguo 25/02/2011, 07:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Ayuda con SQL muy complicado!

En el formulario de busqueda te faltara algo para poder seleccionar dias de la semana, una vez solucionado eso

Select * from TuTabla
WHERE fecha>='2000-01-01' and fecha_fin<='2000-01-31' and lun=1

dará los eventos ocurridos en los lunes de enero del 2000.

Claro esta que la misma consulta no te sirve para los martes ni para eventos donde no se seleccione el dia de la semana, el scrpt que te controle todo esto debe construir la consulta en funcion de los datos introducidos en el formulario de busqueda.

El hecho que la fecha_fin siempre este informada aun que sea igual a fecha te puede facilitar el diseño del script...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 25/02/2011, 07:53
 
Fecha de Ingreso: febrero-2007
Mensajes: 309
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: Ayuda con SQL muy complicado!

Cita:
Iniciado por quimfv Ver Mensaje
En el formulario de busqueda te faltara algo para poder seleccionar dias de la semana, una vez solucionado eso

Select * from TuTabla
WHERE fecha>='2000-01-01' and fecha_fin<='2000-01-31' and lun=1

dará los eventos ocurridos en los lunes de enero del 2000.

Claro esta que la misma consulta no te sirve para los martes ni para eventos donde no se seleccione el dia de la semana, el scrpt que te controle todo esto debe construir la consulta en funcion de los datos introducidos en el formulario de busqueda.

El hecho que la fecha_fin siempre este informada aun que sea igual a fecha te puede facilitar el diseño del script...
Es cierto, pero el cliente no quiere que en el formulario hallan check para los dias de la semana.
__________________
Responder encuestas
  #6 (permalink)  
Antiguo 25/02/2011, 08:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ayuda con SQL muy complicado!

Bueno, para poder responder, primero tienes que aclarar un par de detalles:
1) Si la fecha del evento es única, ¿se usan los dos campos de fecha de la tabla o sólo uno?
2) Si el evento es semanal y se repite siempre el mismo día, ¿Se usan ambas fechas? ¿Cómo se indica la iteratividad del evento?
3) Si el evento dura cierta cantidad de días, ¿se usan los campos de días?

Un detalle adicional es que en el ejemplo que das, es innecesario poner siete campos, uno para cada día, que son flags. Con uno solo TINYINT es suficiente, si almacenas en valor del día de la semana (DAYOFWEEK(fecha)), ya que ese valor tiene un rago de 1 a 7.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 25/02/2011, 08:42
 
Fecha de Ingreso: febrero-2007
Mensajes: 309
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: Ayuda con SQL muy complicado!

1) Si la fecha del evento es única, ¿se usan los dos campos de fecha de la tabla o sólo uno?
Si es unica se usa solo el campo fecha

2) Si el evento es semanal y se repite siempre el mismo día, ¿Se usan ambas fechas? ¿Cómo se indica la iteratividad del evento?
Siempre que un evento dure mas de un dia se usa el campo fecha y ademas el campo fecha_fin. Si además se realiza algunos dias de la semana solamente se usan los campos lun, mar, mie.... para indicar en que dias se realiza

3) Si el evento dura cierta cantidad de días, ¿se usan los campos de días?
Siempre y cuando se realice solo algunos dias de la semana

Un detalle adicional es que en el ejemplo que das, es innecesario poner siete campos, uno para cada día, que son flags. Con uno solo TINYINT es suficiente, si almacenas en valor del día de la semana (DAYOFWEEK(fecha)), ya que ese valor tiene un rago de 1 a 7.
Necesito 7 porque un evento puede realizarse uno o varios dias de la semana

Gracias!
  #8 (permalink)  
Antiguo 25/02/2011, 08:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ayuda con SQL muy complicado!

¿Los campos que no se usan quedan NULL o tienen valor por default?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 25/02/2011, 08:49
 
Fecha de Ingreso: febrero-2007
Mensajes: 309
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: Ayuda con SQL muy complicado!

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿Los campos que no se usan quedan NULL o tienen valor por default?
quedan en 0, pero me acabo de dar cuenta que deberian quedar en 1 los siete o en null
__________________
Responder encuestas
  #10 (permalink)  
Antiguo 25/02/2011, 09:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ayuda con SQL muy complicado!

Bueno, con esa información ya puedes plantearte las condiciones que se deben cumplir:
- Fecha actual:
Cita:
fecha_inicio = CURDATE() AND fecha_final IS NULL AND campodía = 1
- Fecha actual, sólo evento de fecha única (por ejemplo, día lunes):
Cita:
fecha_inicio = CURDATE() AND fecha_final IS NULL AND lun = 1 AND NOT( mar OR mie OR jue OR vie OR sab OR dom)
- Fecha en un periodo:
Cita:
CURDATE() BETWEEN fecha_inicio AND fecha_final AND campodia = 1
En fin, lo que debes hacer es buscar las alternativas, plantearte qué es lo que debe cumplirse, y luego creas un método que le vaya agregando o sacando condiciones según lo que quieras buscar.

¿Se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 25/02/2011, 09:37
 
Fecha de Ingreso: febrero-2007
Mensajes: 309
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: Ayuda con SQL muy complicado!

Gracias, pero el problema esta repito en que el cliente no quiere que en el formulario hallan check para los dias de la semana. O sea que yo no voy a buscar solo eventos que sean los dias lunes. El problema radica en que no quiero que me traiga eventos que se realizan dias de la semana que no entran entre las fechas.
Es más complicado de lo que parece.
  #12 (permalink)  
Antiguo 25/02/2011, 09:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Ayuda con SQL muy complicado!

No. Lo que debes hacer, como te decimos, es ver cómo construir las condiciones de la consulta en forma dinámica, sobre la base de lo que tienes como datos de entrada y lo que debe cumplirse para obtener los diferentes resultados en una única tabla resultado.
Con lo que te hemos sugerido, al menos como yo lo veo, ya tienes la solución planteada. Solamente tienes que armar el rompecabezas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: 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 14:45.