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

problemas con una colsulta

Estas en el tema de problemas con una colsulta en el foro de Mysql en Foros del Web. 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) ...
  #1 (permalink)  
Antiguo 28/10/2011, 11:17
 
Fecha de Ingreso: octubre-2011
Mensajes: 4
Antigüedad: 12 años, 5 meses
Puntos: 0
problemas con una colsulta

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???
  #2 (permalink)  
Antiguo 28/10/2011, 12:36
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: problemas con una colsulta

Hola palssk:

En tu post pones esto:

Cita:
la fecha_activacion tiene un valor de 2011-10-28 10:24:18 y en DIAS_DIFERENCIA PUES DEBE DAR 0
pero en los datos de ejemplo que estás poniendo de ejemplo la fecha de activación es NULL.

Código:
FECHA_ACTIVACION -----null
Si tu campo FECHA_ACTIVACION es NULL, entonces la función DATEDIFF también te estaría regresando un NULL:

Código MySQL:
Ver original
  1. +---------------------------+
  2. +---------------------------+
  3. |                      NULL |
  4. +---------------------------+
  5. 1 row in set (0.10 sec)
  6.  
  7. mysql> select DATEDIFF(CURDATE(), '2011-10-28 10:24:18');
  8. +--------------------------------------------+
  9. | DATEDIFF(CURDATE(), '2011-10-28 10:24:18') |
  10. +--------------------------------------------+
  11. |                                          0 |
  12. +--------------------------------------------+
  13. 1 row in set (0.00 sec)

¿No te estarás refiriendo a tu campo DATE_PURCHASED? este campo si tiene la fecha que mencionas.

Debes tener cuidado al utilizar LEFT JOINS, pues este sirve justamente para unir dos tablas independientemente de que existan datos en una de ellas, rellenando con NULL'S los campos que no tengan información. Verifica la información de tu tabla, si no quieres mostrar los registros que tengan fecha de activación nula simplemente agrega a tu filtro esta condición:

Código:
AND B.FECHA_ACTIVACION IS NOT NULL
Saludos
Leo.
  #3 (permalink)  
Antiguo 28/10/2011, 13:15
 
Fecha de Ingreso: octubre-2011
Mensajes: 4
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: problemas con una colsulta

Gracias por contestar...
Resulta que el campo Fecha_activacion para el customers_id = 25 si tiene una fecha que es la de 2011-10-28 11:27:44 que es la que en realidad tenia que ser en vez de la que puse anteriormente

Ahora con si agrego el AND FECHA_ACTIVACION IS NOT NULL EL RESULTADO ES un cero en ese campo

Lo que se me ocurrio y no se si es lo mas ortodoxo en cuanto a la estructura de la consulta fue lo sig:

SELECT COUNT( A.ORDERS_ID ) AS NUM_COMPRAS , A.DATE_PURCHASED, (select fecha_activacion from membresia where customers_id = 25), CURDATE() AS FECHA_ACTUAL, DATEDIFF(CURDATE(), (select fecha_activacion from membresia where customers_id = 25)) 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_COMPRAS----------------------------------------------------------------------2
DATE_PURCHASED------------------------------------------------------------------2011-10-28 10:24:18
(select fecha_activacion from membresia where customers_id = 25)----2011-10-28 11:27:44
FECHA_ACTUAL----------------------------------------------------------------------2011-10-28
DIAS_DIFERENCIA-------------------------------------------------------------------0

Pero al nombrar
(select fecha_activacion from membresia where customers_id = 25) as FECHA
ya el DATEDIFF me marcar error busca a FECHA como un campo de una tabla

alguna idea?
gracias x contetar!!!
  #4 (permalink)  
Antiguo 29/10/2011, 08:21
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: 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)

Etiquetas: join, select, tabla
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 01:05.