Ver Mensaje Individual
  #4 (permalink)  
Antiguo 29/10/2011, 08:21
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: problemas con una colsulta

Volvamos al principio:
Cita:
Iniciado por palssk Ver Mensaje
Bien tengo 2 tablas Orders y Membresia y realizo la sig consulta

SELECT COUNT( A.ORDERS_ID ) AS NUM_COMPRAS , A.DATE_PURCHASED, B.FECHA_ACTIVACION, CURDATE() FECHA_ACTUAL, DATEDIFF(CURDATE(), B.FECHA_ACTIVACION) AS DIAS_DIFERENCIA
FROM ORDERS A
LEFT JOIN MEMBRESIA B ON ( A.ORDERS_ID = B.ORDERS_ID )
WHERE A.DATE_PURCHASED >= '2011-10-28' AND A.CUSTOMERS_ID =25

Y el resultado es:

NUM_COMPRA ------------ 2
DATE_PURCHASED--------2011-10-28 10:24:18
FECHA_ACTIVACION -----null
FECHA_ACTUAL----------- 2011-10-28
DIAS_DIFERENCIA--------null

la fecha_activacion tiene un valor de 2011-10-28 10:24:18 y en DIAS_DIFERENCIA PUES DEBE DAR 0, que es lo que tiene mal la consulta???
Tienes dos problemas:
1) Estás usando LEFT JOIN en lugar de INNER JOIN, por lo cual se infiere que no existen valores en ORDERS y MEMBRESIA que estén relacionados. Eso hace que devuelva NULL, y toda operación realizada con NULL da NULL, por eso obtienes ese resultado.
Revisa los datos de esa tabla, y en todo caso prueba haciendo:
Código MySQL:
Ver original
  1.   A.ORDERS_ID,
  2.   A.DATE_PURCHASED,
  3.   B.ORDERS_ID,
  4.   B.FECHA_ACTIVACION
  5.   ORDERS A INNER JOIN MEMBRESIA B ON (A.ORDERS_ID = B.ORDERS_ID)
  6.   A.CUSTOMERS_ID =25
Si eso no devuelve datos, pues simplemente no hay registros en MEMBRESÏA con ese valor como FK...

2) Tienes que tener mucho cuidado al manipular fechas de tipo DATETIME y DATE en una misma sentencia. MySQL realiza cierto tipo de conversiones en forma implícita, por lo que los resultados pueden ser diferentes a lo esperado si no lo tienes en cuenta.
Cuando MySQL encuentra DATE y DATETIME usado en una misma operación lo que hace es convertir todos los datos a su formato mayor, esto es, convierte el DATE en DATETIME, pero como no tiene horas declaradas para eso, le pone la hora cero, por lo cual el verdadero valor de '2011-10-28' es en realidad '2011-10-28 00:00:00' ... con lo cual la comparación A.DATE_PURCHASED >= '2011-10-28' devuelve datos, ya que "2011-10-28 10:24:18" es mayor a '2011-10-28 00:00:00', ya que se tiene en cuenta la hora como parte del dato.
Ahora bien, ten en cuenta que para que DATEDIFF devuelva un valor dado comparando DATETIMEs, el valor de diferencia en horas, minutos y segundos debe ser mayor a 24 horas, o de lo contrario no habrá pasado realmente un día.
¿Se entiende el problema)

Si lo que quieres es que sólo tome en cuenta la fecha, tienes que indicarlo expresamente usando DATE():
Código MySQL:
Ver original
  1.   COUNT( A.ORDERS_ID ) NUM_COMPRAS ,
  2.   A.DATE_PURCHASED,
  3.   B.FECHA_ACTIVACION,
  4.   CURDATE() FECHA_ACTUAL,
  5.   B.FECHA_ACTIVACION) DIAS_DIFERENCIA
  6.   ORDERS A LEFT JOIN MEMBRESIA B ON ( A.ORDERS_ID = B.ORDERS_ID )
  7.   DATE(A.DATE_PURCHASED)>= '2011-10-28' AND A.CUSTOMERS_ID =25

Todos estos detalles que te comento de las fechas están en el manual de referencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)