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

[SOLUCIONADO] Between de MYSQL usando PHP

Estas en el tema de Between de MYSQL usando PHP en el foro de Mysql en Foros del Web. Hola amigos, me estoy matando y no puedo resolver este problema: En la consola del MYSQL del PHPMYADMIN uso el siguiente comando SELECT * FROM ...
  #1 (permalink)  
Antiguo 21/01/2013, 20:08
 
Fecha de Ingreso: enero-2013
Mensajes: 62
Antigüedad: 11 años, 10 meses
Puntos: 0
Between de MYSQL usando PHP

Hola amigos, me estoy matando y no puedo resolver este problema:

En la consola del MYSQL del PHPMYADMIN uso el siguiente comando

SELECT *
FROM turf_poscns
LEFT JOIN turf_carrr ON turf_poscns.idcarrr = turf_carrr.idcarrr
LEFT JOIN turf_jockey ON turf_poscns.idjockey = turf_jockey.idjockey
LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn = turf_carrr.idubiccn
WHERE turf_carrr.fecha
BETWEEN "2012-01-01"
AND "2013-01-10"

y Funciona Perfecto, pero cuando quiero meterlo en el codigo PHP no funciona

Código PHP:

$SSQL2
= ("SELECT * FROM turf_poscns 
            LEFT JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
            LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey 
            LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn


    WHERE turf_carrr.fecha Between $FechaI AND $FechaF 
Las Variables tienen este contenido $FechaI= 2013-01-01 $FechaF= 2013-01-20, me da una respuesta vacia
Tambien probe entre otras cosas escribirlo asi:

Código PHP:

$SSQL2
= ("SELECT * FROM turf_poscns 
            LEFT JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
            LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey 
            LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn


    WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF' 
y tampoco me reconoce los datos

Les agradezco cualquier ayuda para resolver esto, estoy trancado con el trabajo.
La version de Mysql es la Mysqly y el último PHP
  #2 (permalink)  
Antiguo 21/01/2013, 20:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Between de MYSQL usando PHP

La primera consulta no te devuelve datos porque en ese contexto el contenido de las variables ingresa como si fuese una operación aritmética, que el SQL resuelve.
Es decir, esto es lo que recibe:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2. LEFT JOIN turf_carrr ON turf_poscns.idcarrr = turf_carrr.idcarrr
  3. LEFT JOIN turf_jockey ON turf_poscns.idjockey = turf_jockey.idjockey
  4. LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn = turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha BETWEEN 2012-01-01 AND 2013-01-10
Y esto es lo que ejecuta:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2. LEFT JOIN turf_carrr ON turf_poscns.idcarrr = turf_carrr.idcarrr
  3. LEFT JOIN turf_jockey ON turf_poscns.idjockey = turf_jockey.idjockey
  4. LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn = turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha BETWEEN 2010 AND 2002
¿Se entiende?
Lo interpreta como una resta, por lo que hace la resta y los valores pasan a ser un rango sin respuestas (el rango menor/mayor está invertido y su resultado es cero).

El segundo caso debería darte resultados, porque los apostrofos se usan en SQL para encerrar cadenas de texto, con lo que MySQL las interpretará como fechas dado el formato:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     LEFT JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3.     LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey
  4.     LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn
  5.     WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF'
pero sólo te los puede dar si existe algún registro turf_poscns relacionado con un registro de turf_carrr que pueda cumplir con turf_poscns.idcarrr=turf_carrr.idcarrr y al mismo tiempo turf_carrr.fecha Between '$FechaI' AND '$FechaF', de lo contrario el valor de turf_carrr.fecha será NULL... y los NULL no devuelven datos.

¿Se entiende?
Si quieres verificarlo, haz lo siguiente:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3. WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF'
Si esto devuelve datos, la otra consulta también debe devolverlos, y el problema no sería la consulta en si.

Ahora bien, ¿el campo turf_carrr.fecha es un DATE o DATETIME, no es así?

Pregunto para asegurarme...
__________________
¿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 21/01/2013, 20:28
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Between de MYSQL usando PHP

Tienes que encerrar las fechas en comillas simples como lo haces en el segundo código:

Código PHP:
Ver original
  1. $SSQL2 = "SELECT * FROM turf_poscns  
  2.            LEFT JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3.            LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey  
  4.            LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn
  5.            WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF'";

Prueba así y trata de imprimir $FechaI y $FechaF, para ver si está correcta la información de esas variables.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #4 (permalink)  
Antiguo 21/01/2013, 20:33
 
Fecha de Ingreso: enero-2013
Mensajes: 62
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Between de MYSQL usando PHP

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La primera consulta no te devuelve datos porque en ese contexto el contenido de las variables ingresa como si fuese una operación aritmética, que el SQL resuelve.
Es decir, esto es lo que recibe:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2. LEFT JOIN turf_carrr ON turf_poscns.idcarrr = turf_carrr.idcarrr
  3. LEFT JOIN turf_jockey ON turf_poscns.idjockey = turf_jockey.idjockey
  4. LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn = turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha BETWEEN 2012-01-01 AND 2013-01-10
Y esto es lo que ejecuta:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2. LEFT JOIN turf_carrr ON turf_poscns.idcarrr = turf_carrr.idcarrr
  3. LEFT JOIN turf_jockey ON turf_poscns.idjockey = turf_jockey.idjockey
  4. LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn = turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha BETWEEN 2010 AND 2002
¿Se entiende?
Lo interpreta como una resta, por lo que hace la resta y los valores pasan a ser un rango sin respuestas (el rango menor/mayor está invertido y su resultado es cero).

El segundo caso debería darte resultados, porque los apostrofos se usan en SQL para encerrar cadenas de texto, con lo que MySQL las interpretará como fechas dado el formato:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     LEFT JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3.     LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey
  4.     LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn
  5.     WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF'
pero sólo te los puede dar si existe algún registro turf_poscns relacionado con un registro de turf_carrr que pueda cumplir con turf_poscns.idcarrr=turf_carrr.idcarrr y al mismo tiempo turf_carrr.fecha Between '$FechaI' AND '$FechaF', de lo contrario el valor de turf_carrr.fecha será NULL... y los NULL no devuelven datos.

¿Se entiende?
Si quieres verificarlo, haz lo siguiente:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3. WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF'
Si esto devuelve datos, la otra consulta también debe devolverlos, y el problema no sería la consulta en si.

Ahora bien, ¿el campo turf_carrr.fecha es un DATE o DATETIME, no es así?

Pregunto para asegurarme...
El campo es DATE
  #5 (permalink)  
Antiguo 21/01/2013, 20:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Between de MYSQL usando PHP

OK. Me aseguraba...
Muchas veces vienen con problemas así y termina siendo que usan VARCHAR con formato DD/MM/AAAA, lo cual es un error total.

Respecto al caso, ¿probaste lo que te dije?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 21/01/2013, 20:40
 
Fecha de Ingreso: enero-2013
Mensajes: 62
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Between de MYSQL usando PHP

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La primera consulta no te devuelve datos porque en ese contexto el contenido de las variables ingresa como si fuese una operación aritmética, que el SQL resuelve.
Es decir, esto es lo que recibe:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2. LEFT JOIN turf_carrr ON turf_poscns.idcarrr = turf_carrr.idcarrr
  3. LEFT JOIN turf_jockey ON turf_poscns.idjockey = turf_jockey.idjockey
  4. LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn = turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha BETWEEN 2012-01-01 AND 2013-01-10
Y esto es lo que ejecuta:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2. LEFT JOIN turf_carrr ON turf_poscns.idcarrr = turf_carrr.idcarrr
  3. LEFT JOIN turf_jockey ON turf_poscns.idjockey = turf_jockey.idjockey
  4. LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn = turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha BETWEEN 2010 AND 2002
¿Se entiende?
Lo interpreta como una resta, por lo que hace la resta y los valores pasan a ser un rango sin respuestas (el rango menor/mayor está invertido y su resultado es cero).

El segundo caso debería darte resultados, porque los apostrofos se usan en SQL para encerrar cadenas de texto, con lo que MySQL las interpretará como fechas dado el formato:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     LEFT JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3.     LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey
  4.     LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn
  5.     WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF'
pero sólo te los puede dar si existe algún registro turf_poscns relacionado con un registro de turf_carrr que pueda cumplir con turf_poscns.idcarrr=turf_carrr.idcarrr y al mismo tiempo turf_carrr.fecha Between '$FechaI' AND '$FechaF', de lo contrario el valor de turf_carrr.fecha será NULL... y los NULL no devuelven datos.

¿Se entiende?
Si quieres verificarlo, haz lo siguiente:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3. WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF'
Si esto devuelve datos, la otra consulta también debe devolverlos, y el problema no sería la consulta en si.

Ahora bien, ¿el campo turf_carrr.fecha es un DATE o DATETIME, no es así?

Pregunto para asegurarme...

Use el código que me pasastes y me funciono el filtro, ¿que me sugeris que modifique o pruebe para resolver el problema en particular?
  #7 (permalink)  
Antiguo 21/01/2013, 20:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Between de MYSQL usando PHP

Bien, si esto te funcionó:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3. WHERE turf_carrr.fecha BETWEEN '$FechaI' AND '$FechaF'
Esto otro debería funcionar:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3.     LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey
  4.     LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha BETWEEN '$FechaI' AND '$FechaF'
Cuidado con un detalle: Para MySQL usar apóstrofos (') y comillas (") es diferente. Las segundas no se usan para las cadenas de texto, a menos que el servidor de MySQL esté específicamente configurado para ello (cosa poco habitual).
Usar comillas podría devolverte un error de sintaxis.
Otro detalle es recordar que los valores de cada variable tienen que entrar siempre como
Código MySQL:
Ver original
  1. columna BETWEEN menor AND mayor
o de lo contrario no devolverá datos.
Ahora bien, lo que te conviene para asegurarte el resultado es, antes que la envíe a ejecutar, capturar la sentencia que envía para confirmar manualmente la ejecución:
Código PHP:
Ver original
  1. $SSQL2 = ("SELECT * FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3.     LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey
  4.     LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF' ");
  6. echo $SSQL2;
Cuando te muestre en pantalla, verificas si está bien escrita, con sus fechas correctamente puestas, la copias y la pruebas a mano.
Luego cuéntanos como salió en ambos casos (en el script y a mano).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 21/01/2013, 21:07
 
Fecha de Ingreso: enero-2013
Mensajes: 62
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Between de MYSQL usando PHP

No te imaginas lo contento que estoy con tu ayuda, hace varioas dias que estoy peleando con las fechas.
Muchisimas Gracias por tu colaboración.

El código quedó así

Código PHP:
"SELECT * FROM turf_poscns 

          INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
          LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey 
          LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn

WHERE turf_carrr.fecha BETWEEN '$FechaI' AND '$FechaF'  AND turf_poscns.idjockey=2 
Veras que agregue otra condicion y funciona perfecto, pero me falta una, que compara con
turf_carrr.idubiccn que esta escrita en el 3er JOIN y esa no funciona, escucho ideas.

Igual ya logre una consulta bastante concreta, baje de miles de filas a centenas y puedo ver de filtrarlos en el While.
pero si se te ocurre algo avisame que estaré pendiente
  #9 (permalink)  
Antiguo 21/01/2013, 21:17
 
Fecha de Ingreso: enero-2013
Mensajes: 62
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: Between de MYSQL usando PHP

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Bien, si esto te funcionó:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3. WHERE turf_carrr.fecha BETWEEN '$FechaI' AND '$FechaF'
Esto otro debería funcionar:
Código MySQL:
Ver original
  1. FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3.     LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey
  4.     LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha BETWEEN '$FechaI' AND '$FechaF'
Cuidado con un detalle: Para MySQL usar apóstrofos (') y comillas (") es diferente. Las segundas no se usan para las cadenas de texto, a menos que el servidor de MySQL esté específicamente configurado para ello (cosa poco habitual).
Usar comillas podría devolverte un error de sintaxis.
Otro detalle es recordar que los valores de cada variable tienen que entrar siempre como
Código MySQL:
Ver original
  1. columna BETWEEN menor AND mayor
o de lo contrario no devolverá datos.
Ahora bien, lo que te conviene para asegurarte el resultado es, antes que la envíe a ejecutar, capturar la sentencia que envía para confirmar manualmente la ejecución:
Código PHP:
Ver original
  1. $SSQL2 = ("SELECT * FROM turf_poscns
  2.     INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
  3.     LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey
  4.     LEFT JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn
  5. WHERE turf_carrr.fecha Between '$FechaI' AND '$FechaF' ");
  6. echo $SSQL2;
Cuando te muestre en pantalla, verificas si está bien escrita, con sus fechas correctamente puestas, la copias y la pruebas a mano.
Luego cuéntanos como salió en ambos casos (en el script y a mano).

Lo terminé de Resolver:
Cambie el último JOIN de LEFT a INNER, y funciona perfecto, te dejo el código

Código PHP:
"SELECT * FROM turf_poscns 

    INNER JOIN turf_carrr ON turf_poscns.idcarrr=turf_carrr.idcarrr
       LEFT JOIN turf_jockey ON turf_poscns.idjockey=turf_jockey.idjockey 
            INNER JOIN turf_ubiccn ON turf_ubiccn.idubiccn=turf_carrr.idubiccn

WHERE turf_carrr.fecha BETWEEN '$FechaI' AND '$FechaF'  AND turf_poscns.idjockey=$idjoc AND turf_ubiccn.idubiccn=$Hipodromo 
Muchisimas Gracias , nunca lo hubiera resuelto sin tu colaboración

Etiquetas: php
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 22:30.