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

consulta de fechas con between

Estas en el tema de consulta de fechas con between en el foro de Mysql en Foros del Web. Saludos, tengo una consulta que vincula dos tablas (clientes y facturas) la cual permite consultar el estado de la deuda de cada uno de los ...
  #1 (permalink)  
Antiguo 10/12/2014, 08:49
Avatar de heberthm  
Fecha de Ingreso: noviembre-2013
Ubicación: Cali
Mensajes: 65
Antigüedad: 10 años, 4 meses
Puntos: 1
Pregunta consulta de fechas con between

Saludos, tengo una consulta que vincula dos tablas (clientes y facturas) la cual permite consultar el estado de la deuda de cada uno de los clientes en una fecha determinada. La consulta tiene dos opciones en la clausula WHERE, una es poder listar todos los clientes que estan al dia con los pagos y la segunda es filtrar los datos por rango de fecha.

La consulta recibe los datos pasadas como variables desde un formulario.

Aqui está la consulta.
Código MySQL:
Ver original
  1. SELECT   C.cedula,  C.fecha_inicial,  C.nombre, C.apellido1, C.apellido2, C.telefono, C.valor_credito,
  2.    C.tasa_interes, C.valor_interes, C.total_pagar, F.estado, F.abono_interes, F.mes  
  3. FROM clientes C, facturas F
  4. WHERE C.cedula = F.cedula  AND F.estado='Al dia'  
  5. AND  C.fecha_inicial BETWEEN '".$fecha_inicial."' AND '".$fecha_final."'




La parte que no funciona es cuando quiero listar todos los datos del cliente que se encuetre al dia con los pagos corresponde a : WHERE C.cedula = F.cedula AND F.estado='Al dia'

Será que estoy formulado mal la consulta sql.
Gracias de antemano por su colaboración.
__________________
Hebeth Mazuera

Última edición por gnzsoloyo; 10/12/2014 a las 09:04 Razón: Codigo SQL sin etiquetar
  #2 (permalink)  
Antiguo 10/12/2014, 09:13
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: consulta de fechas con between

Cita:
Será que estoy formulado mal la consulta sql.
No necesariamente, pero tiene todo el aspecto d eun problema de datos.
hay dos condiciones en tu query, y para ponerla limpia usando INNER JOIN en lugar de JOIN implícito. Te recomiendo que los evites.
Código MySQL:
Ver original
  1.   C.cedula,
  2.   C.fecha_inicial,
  3.   C.nombre,
  4.   C.apellido1,
  5.   C.apellido2,
  6.   C.telefono,
  7.   C.valor_credito,
  8.   C.tasa_interes,
  9.   C.valor_interes,
  10.   C.total_pagar,
  11.   F.estado,
  12.   F.abono_interes,
  13.   F.mes  
  14. FROM clientes C INNER JOIN facturas F ON C.cedula = F.cedula  
  15. WHERE F.estado='Al dia'
  16.    AND  C.fecha_inicial BETWEEN '".$fecha_inicial."' AND '".$fecha_final."'
En primer lugar: ¿Realmente estás almacenando en la columna "estado" una cadena de texto que dice eso? No parece una condicion muy práctica, ya que es suceptible a errores, si ese dato se almacena manualmente... ¿Lo consideraste?
Por otro lado, la fecha, ese BETWEEN sólo funcionará si la columna es un DATE o DATETIME (nunca un VARCHAR), y además la fecha está en un formato "AAAA-MM-DD"
¿Eso se cumple?

Para ver si realmente anda por alli la cosa sería mejor que hicieras una prueba manual de este tipo:
1. Verificar si la query base devuelve datos:
Código MySQL:
Ver original
  1.   C.cedula,
  2.   C.fecha_inicial,
  3.   C.nombre,
  4.   C.apellido1,
  5.   C.apellido2,
  6.   C.telefono,
  7.   C.valor_credito,
  8.   C.tasa_interes,
  9.   C.valor_interes,
  10.   C.total_pagar,
  11.   F.estado,
  12.   F.abono_interes,
  13.   F.mes  
  14. FROM clientes C INNER JOIN facturas F ON C.cedula = F.cedula
2. Verificar si hay registros con estado buscado:
Código MySQL:
Ver original
  1.   C.cedula,
  2.   C.fecha_inicial,
  3.   C.nombre,
  4.   C.apellido1,
  5.   C.apellido2,
  6.   C.telefono,
  7.   C.valor_credito,
  8.   C.tasa_interes,
  9.   C.valor_interes,
  10.   C.total_pagar,
  11.   F.estado,
  12.   F.abono_interes,
  13.   F.mes  
  14. FROM clientes C INNER JOIN facturas F ON C.cedula = F.cedula  
  15. WHERE F.estado='Al dia'
3. Buscar si hay registros en un rango, pero hacerlo sin uso de variables:
Código MySQL:
Ver original
  1.   C.cedula,
  2.   C.fecha_inicial,
  3.   C.nombre,
  4.   C.apellido1,
  5.   C.apellido2,
  6.   C.telefono,
  7.   C.valor_credito,
  8.   C.tasa_interes,
  9.   C.valor_interes,
  10.   C.total_pagar,
  11.   F.estado,
  12.   F.abono_interes,
  13.   F.mes  
  14. FROM clientes C INNER JOIN facturas F ON C.cedula = F.cedula  
  15. WHERE C.fecha_inicial BETWEEN '2014-11-11' AND '2014-12-10'
Comentanos qué devuelve cada una.
__________________
¿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 10/12/2014, 10:30
Avatar de heberthm  
Fecha de Ingreso: noviembre-2013
Ubicación: Cali
Mensajes: 65
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: consulta de fechas con between

Saludo gnzsoloyo, gracias por atender mi pregunta.
Realmente la consulta funciona al seleccionar en el formulario las fechas en formato Mysql (YYYY-mm-dd) a través de un date Picker.
el reporte me arroja los datos esperados, osea que la parte del where correspondiente a:

WHERE C.fecha_inicial BETWEEN '".$fecha_inicial."' AND '".$fecha_final."'

Pero cuando quiero generar el reporte total de los clientes que se encuentra con estado "AL dia" el reporte se genera sin mostrar los datos requeridos.

EL dato del campo "Estado" se obtiene dinamicamente como resultado de una suma de fechas en la tabla clientes.

EL campo fecha es de tipo DATE.

Aqui una imágen del formulario que genera el reporte.

https://drive.google.com/file/d/0B35M0CzUD61vNDZwamZJa3BkWDA/view
__________________
Hebeth Mazuera
  #4 (permalink)  
Antiguo 10/12/2014, 10:52
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: consulta de fechas con between

Por empezar, recordemos un detalle: La base de datos no "ve" formularios, de modo que el hecho de que obtengas el dato de un DatePicker es completamente irrelevante para MySQL. Dependerá de si al insertar el dato en la query el formato de la fecha que MySQL espera se respeta o no.
El resto, no nos afecta.
En este foro sólo tratamos los temas de SQL, no Programación (ver las nbormas del foro, por favor).

En cuanto al problema del estado, eso es loque no se cumple en tu problema. Es decir que como dije al principio, hay un problema con los datos. Como los estás comaprando como cadena de texto, dependerá de los datos que haya en la tabla, y muy especialmente del charset y collation que tenga declarados.
¿Por qué?
Porque si fuese una collation utf8_general_bin, y no utf8_general_ci, por ejemplo, buscar "AL día" y "Al dia" no traerían los mismos resultados. Eso, simplemente porque toda collation terminada en "bin" es sensible a mayúsculas y minúsculas, y en ese caso "Al" y "AL" son diferentes...
¿Se entiende?

Normalmente se suele tratar de evitar usar cadenas de texto como valores de validación, y se usan booleanos o bien numéricos, los cuales al no estar afectados por las collation no se producen este tipo de cosas.

Verifica exactamente el tipo de columna, y la escritura de los datos en esa columna, verificando contra registros que existan en la base.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 10/12/2014, 12:58
Avatar de heberthm  
Fecha de Ingreso: noviembre-2013
Ubicación: Cali
Mensajes: 65
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: consulta de fechas con between

tedré en cuenta tus recomendaciones.

Agradezco tu pronta colaboración.
__________________
Hebeth Mazuera

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 15:52.