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

Consultar registros en un rango de varios campos

Estas en el tema de Consultar registros en un rango de varios campos en el foro de Mysql en Foros del Web. Hola gente del foro, tengo un problema mas logico que tecnico y no puedo resolverlo . el tema es asi tengo una tabla: -------------------------- Dia ...
  #1 (permalink)  
Antiguo 19/07/2012, 12:27
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Pregunta Consultar registros en un rango de varios campos

Hola gente del foro, tengo un problema mas logico que tecnico y no puedo resolverlo . el tema es asi tengo una tabla:

--------------------------
Dia - Mes - Año - ID
--------------------------

(Masomenos asi para el caso servira el ejemplo)

y quiero seleccionar todos los 'ID' que esten entre dos fechas ej:

DiaMin MesMin AñoMin

y

DiaMax MesMax AñoMax

la consulta seria
Cita:
'SELECT ID FROM tabla WHERE...'
no logro armar las condiciones para lograr lo que quiero talvez a alguno se le ocurra mas rapido y pueda darme una mano...

Nota:Los campos dia mes y año estan separados no es un campo del tipo date.
  #2 (permalink)  
Antiguo 19/07/2012, 12: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: Consultar registros en un rango de varios campos

Por un lado, sería mejor que esa tabla tuviese un sólo campo de tipo DATE y no tres campos separados. ¿Por qué klos tienes así?
Además de esto, necesitamos saber de qué tipo de dato es cada campo y cómo están almacenados los valores en esos campos (una muestra de datos). Dependiendo de cómo estén cargados, será la función que se use en la consulta.
Fuera de eso, es una consulta simple.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 19/07/2012, 13:13
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Consultar registros en un rango de varios campos

hola gnzsoloyo, los tengo asi porque esmas facil para trabajarlos en el resto del sistema, solo para un caso particular nesesito seleccionar un rango sino los utilizo como estan y me es muy comodo, los tipos de datos son numericos:

ID int(11) No None auto_increment
DM tinyint(2) No None
MM tinyint(2) No None
AM smallint(6) No None

dia varia de 1 a 31
mes de 1 a 12
ano de 2010 en adelante hasta ahora 2012

las condiciones son sin duda un agrupamiento logico simple como tu dises pero tengo el cerebro nublado y no puedo amarla, tengo esto:

Código MySQL:
Ver original
  1.         (
  2.             CD.DM<='".$Parametros[MaxDia]."'
  3.         AND
  4.             CD.DM>='".$Parametros[MinDia]."'
  5.         AND
  6.             CD.MM<='".$Parametros[MaxMes]."'
  7.         AND
  8.             CD.MM>='".$Parametros[MinMes]."'
  9.         AND
  10.             CD.AM<='".$Parametros[MaxAno]."'
  11.         AND
  12.             CD.AM>='".$Parametros[MinAno]."'           
  13.         )
pero claramente no es lo que sirve...
  #4 (permalink)  
Antiguo 19/07/2012, 13:26
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consultar registros en un rango de varios campos

Hola NSD:

Es la primera vez que leo a alguien decir que es más fácil trabajar las fechas como campos separados que como un campo fecha... me sorprende que pienses así, puedo asegurarte que no es así, además del espacio de más que estás ocupando, puedes tener un grave problema de integridad, pues nada te impide poner un 76 como día o un 65 como mes... Es decir, tienes que tener reglas de integridad para asegurar que lo que estás almacenando sea consistente con una fecha válida... los campos tipo DATETIME, DATE y TIME existen por una razón no crees???

¿Necesitas manejar en tu programa los datos por separado?, perfecto, nada te impide hacerlo y MySQL proporciona las funciones necesarias para que lo hagas si necesidad de hacer malabares:

Código MySQL:
Ver original
  1. mysql> SELECT NOW(), YEAR(NOW()), MONTH(NOW()), DAY(NOW());
  2. +---------------------+-------------+--------------+------------+
  3. | NOW()               | YEAR(NOW()) | MONTH(NOW()) | DAY(NOW()) |
  4. +---------------------+-------------+--------------+------------+
  5. | 2012-07-19 14:20:32 |        2012 |            7 |         19 |
  6. +---------------------+-------------+--------------+------------+
  7. 1 row in set (0.02 sec)
  8.  
  9. mysql> SELECT NOW(), HOUR(NOW()), MINUTE(NOW()), SECOND(NOW());
  10. +---------------------+-------------+---------------+---------------+
  11. | NOW()               | HOUR(NOW()) | MINUTE(NOW()) | SECOND(NOW()) |
  12. +---------------------+-------------+---------------+---------------+
  13. | 2012-07-19 14:21:10 |          14 |            21 |            10 |
  14. +---------------------+-------------+---------------+---------------+
  15. 1 row in set (0.01 sec)

Entonces, ¿por qué complicarse la vida?

si puedes cambiar tu modelo de datos HAZLO, pero si te empeñas en seguir trabajando como hasta ahora, lo que tienes que hacer es crear una cadena a partir de los datos separados para convertirla a tipo DATE y de así comparara simplemente por rangos de fecha y hora...

Saludos
Leo.
  #5 (permalink)  
Antiguo 19/07/2012, 13:38
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Consultar registros en un rango de varios campos

Hola leo, no quise decir que fuese mas facil, quese desir que para este uso particular era mas facil nada mas, en el resto coincido con vos.
para evitar problemas de integridad todos los datos los mete el sistema y el usuario solo almacena una fecha mediante listas <select> por lo que no hay lugar a que aparesca un 76 aunque como bien dises seria tecnicamente posible.

cuando te refieres a que los agrupe para no cambiar mi estructura te refieres a algo asi:

Código MySQL:
Ver original
  1. $Parametros[FechaMin]=$Parametros[MinAno].$Parametros[MinMes].$Parametros[MinDia];
  2.         $Parametros[FechaMax]=$Parametros[MaxAno].$Parametros[MaxMes].$Parametros[MaxDia];
  3.         $Condiciones=" WHERE       
  4.         (
  5.             CONCAT(CD.AM,CD.MM,CD.DM)>='".$Parametros[FechaMin]."'
  6.         AND
  7.             CONCAT(CD.AM,CD.MM,CD.DM)<='".$Parametros[FechaMax]."'
  8.         )";
eso funciona pero hay algo que no me convence del todo talvez sea por eso que tu dises que estoy evaluando rangos innesesarios ejemplo:
20129901 - 20123101 todos los numeros entremedio estan de gusto en la condicion poruqe nunca apareceran, quiza sea el precio de usar mi estructura deficiente
  #6 (permalink)  
Antiguo 19/07/2012, 14:33
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consultar registros en un rango de varios campos

Hola de nuevo:

Mucho cuidado, de la manera en que estás comparando tus datos en realidad estas comparando CADENAS, no fechas... es muy diferente, la idea sería esa, pero como te dije en el post pasado DEBES CONVERTIR TUS DATOS A UNA FECHA VÁLIDA. Es decir, tendrías que hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+------+------+------+
  3. | ID   | DM   | MM   | AM   |
  4. +------+------+------+------+
  5. |    1 |   19 |    7 | 2012 |
  6. |    2 |   14 |    8 | 2012 |
  7. |    3 |    9 |   10 | 2012 |
  8. |    4 |   21 |   12 | 2012 |
  9. +------+------+------+------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT
  13.     ->   id, dm, mm, am,
  14.     ->   STR_TO_DATE(CONCAT(am, '-', mm, '-', dm), '%Y-%c-%e') fecha
  15.     -> FROM tabla;
  16. +------+------+------+------+------------+
  17. | id   | dm   | mm   | am   | fecha      |
  18. +------+------+------+------+------------+
  19. |    1 |   19 |    7 | 2012 | 2012-07-19 |
  20. |    2 |   14 |    8 | 2012 | 2012-08-14 |
  21. |    3 |    9 |   10 | 2012 | 2012-10-09 |
  22. |    4 |   21 |   12 | 2012 | 2012-12-21 |
  23. +------+------+------+------+------------+
  24. 4 rows in set (0.00 sec)

Observa que de esta manera ahora si, estarías comparando contra un campo tipo DATE... también debes tener cuidado con tus parámetros fechaMin y fechaMax... si no traen el formato ANSI de fecha (yyyy-mm-dd) DEBES CONVERTIRLO con la función STR_TO_DATE es decir, debería quedar así:

Código:
STR_TO_DATE(CONCAT(am, '-', mm, '-', dm), '%Y-%c-%e') 
>=
STR_TO_DATE('".$Parametros[FechaMin]."', 'formato de tu fecha')"
en la parte con rojo deberías poner el formato con el que venga tus fechas.

Saludos
Leo.
  #7 (permalink)  
Antiguo 19/07/2012, 15:47
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Consultar registros en un rango de varios campos

creo que voy entendiendo , si llego con el tiempo voy a evaluar convertirlos a tipo date como sugeris puesto que los tipo date puedo indexarlos en la tabla y acelerar la busqueda, en la tabla en custion hay mas de 10000 registros de este tipo y tanto mi primer concat como el tuyo tipo date tendrian que recorrerlos secuencialmente 1x1 ya que no tendrian un indice para apoyarse y eso sin duda tardaria mucho

te hago otra pregunta, actualmente filtro mucho por dia, si lo paso a un tipo date, como hago para filtrar por dia? o por mes, por ejemplo como traigo todos los id del mes 5 con cualquier dia y cualquier año de un tipo date?

la pregunta es basica pero trabaje muy poco con los tipo date y esta sera mi iniciacion formal con ellos :p
  #8 (permalink)  
Antiguo 20/07/2012, 07:44
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consultar registros en un rango de varios campos

Hola de nuevo:

Creo que no te haz dado tiempo para revisar la documentación de MySQL verdad y al parecer tampoco haz leído con detenimiento lo que te he escrito en este post

http://dev.mysql.com/doc/refman/5.0/...functions.html

MySQL proporciona un set muy variado de funciones para el manejo de hora y fecha, en mi primer post te ponía 6 ejemplos de funciones, para extraer el año, mes, dia, hora, minuto y segundo por separado, para lo que preguntas deberás utilizar justamente la que te permite extraer sólo el mes.

Dale un vistazo, PERO EN SERIO, a la documentación, practica con cada función para ver que te puede servir, pregúntale a SAN GOOGLE acerca de cómo manejar fechas en MySQL y si después de hacer esto (PERO EN SERIO HACERLO) si continuas con el problema regresa al foro y expón tus dudas para tratar de ayudarte.

Saludos
Leo.

Etiquetas: campos, consultar, rango, registros, select, tabla, tipo
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 23:55.