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

Datediff - calcular días

Estas en el tema de Datediff - calcular días en el foro de Mysql en Foros del Web. Hola como están? intento crear una consulta en la cual seleccionar los pacientes que tienen cuenta corriente y su fecha de ultima entrega es, en ...
  #1 (permalink)  
Antiguo 21/01/2011, 05:27
mgd
 
Fecha de Ingreso: enero-2009
Mensajes: 129
Antigüedad: 15 años, 2 meses
Puntos: 0
Datediff - calcular días

Hola como están?
intento crear una consulta en la cual seleccionar los pacientes que tienen cuenta corriente y su fecha de ultima entrega es, en dias, mayor a x cantidad de dias.
Ademas de esto necesito saber que cuentas no tienen entregas realizadas.
La consulta que utilizo y funciona bien es esta:

Código SQL:
Ver original
  1. SELECT pacientes.nombre paciente, cuenta.codcuenta, cuentahistoria.fecha, datediff(curdate(), cuentahistoria.fecha) AS dias
  2. FROM cuenta INNER JOIN pacientes ON pacientes.codpaciente = cuenta.codpaciente
  3.                         INNER JOIN cuentahistoria ON cuentahistoria.codcuenta = cuenta.codcuenta
  4. WHERE cuentahistoria.estado = 'ALTA' AND cuentahistoria.movimiento = 'E' AND datediff(curdate(), cuentahistoria.fecha) > 10
  5. GROUP BY cuenta.codcuenta
  6. ORDER BY dias DESC


El problema es que necesito que cuando hago el datediff el valor de cuentahistoria.fecha sea la fecha de esa cuenta mas alta, es decir la ultima fecha de entrega y no tengo idea como hacerlo...
Ademas necesito saber también quienes no han realizados entregas (cuentahistoria.movimiento = 'E')

Muchas gracias
  #2 (permalink)  
Antiguo 21/01/2011, 07:05
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: Datediff - calcular días

Es posible que esto funcione, aunque habría que ver qué significa "movimiento" en esa tabla, para saber si hay que sumarlo.
Código MySQL:
Ver original
  1.     P.nombre paciente,
  2.     C.codcuenta,
  3.     CH.fecha,
  4.     datediff(curdate(), CH.fecha) dias
  5.     cuenta C
  6.     INNER JOIN pacientes P ON P.codpaciente = P.codpaciente
  7.     INNER JOIN
  8.         (SELECT codcuenta, MAX(fecha) fecha, estado, movimiento
  9.         FROM cuentahistoria
  10.         GROUP BY codcuenta) CH ON C.codcuenta = CH.codcuenta
  11.     CH.estado = 'ALTA' AND
  12.     CH.movimiento = 'E' AND
  13.     datediff(curdate(), CH.fecha) > 10
  14. GROUP BY C.codcuenta
__________________
¿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/2011, 08:38
mgd
 
Fecha de Ingreso: enero-2009
Mensajes: 129
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Datediff - calcular días

Tu consulta me ayudo mucho, cambie algunas cositas para que quede como necesitaba.
Código SQL:
Ver original
  1. SELECT
  2.          P.nombre paciente,
  3.          C.codcuenta,
  4.     C.debe,
  5.         CH.fecha,
  6.         DATEDIFF(CURDATE(), CH.fecha) dias
  7. FROM
  8.         cuenta C
  9. INNER JOIN pacientes P ON P.codpaciente = C.codpaciente
  10. INNER JOIN
  11.                 (SELECT codcuenta, MAX(fecha) fecha, estado, movimiento
  12.                 FROM cuentahistoria
  13.         WHERE movimiento = 'E' AND estado = 'ALTA'
  14.                 GROUP BY codcuenta) CH ON C.codcuenta = CH.codcuenta
  15. WHERE
  16.        DATEDIFF(CURDATE(), CH.fecha) > 11 AND c.debe > 0
  17. GROUP BY C.codcuenta
  18. ORDER BY dias DESC;


movimiento = 'E' es la forma de saber si el movimiento es una entrega

Ahora el tema es: como hago para saber en esta misma consulta si un paciente con cuenta corriente no tiene entregas realizadas...

Pense utilizar un OR en datediff del where pero la verdad que no va
  #4 (permalink)  
Antiguo 21/01/2011, 08:55
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: Datediff - calcular días

Podemos aprovechar el LEFT JOIN, pero tienes que tener en cuenta que si no tiene entregas, al menos dos de los campos no pueden figurar en el SELECT porque darían NULL y en el WHERE no pueds consultar por fechas que estén relacionadas a esa tabla.
Sería algo como esto:

Código MySQL:
Ver original
  1.     P.nombre paciente,
  2.     C.codcuenta,
  3.     C.debe
  4.     cuenta C
  5.     INNER JOIN pacientes P ON P.codpaciente = C.codpaciente
  6.     LEFT JOIN
  7.         (SELECT codcuenta, MAX(fecha) fecha, estado, movimiento
  8.         FROM cuentahistoria
  9.         WHERE movimiento = 'E' AND estado = 'ALTA'
  10.         GROUP BY codcuenta) CH ON C.codcuenta = CH.codcuenta
  11.     CH.codcuenta IS NULL
  12. GROUP BY C.codcuenta
__________________
¿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 22/01/2011, 09:54
mgd
 
Fecha de Ingreso: enero-2009
Mensajes: 129
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Datediff - calcular días

si pero no me sirve esa sentencia, ya veré
alomejor hago 2 consultas
gracias
  #6 (permalink)  
Antiguo 22/01/2011, 11:16
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: Datediff - calcular días

Cita:
Iniciado por mgd Ver Mensaje
si pero no me sirve esa sentencia, ya veré
alomejor hago 2 consultas
gracias
Explícate por qué no te sirve la sentencia. Con decir que no te sirve la sentencia no me dices nada.
¿Cuál es el problema?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 24/01/2011, 06:42
mgd
 
Fecha de Ingreso: enero-2009
Mensajes: 129
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Datediff - calcular días

No es que no me sirva perdón, me exprese mal.
La segunda parte de lo que necesito (cuentas a las que nunca se hayan hecho entregas) no puedo o no encuentro la manera de agregarlo a la primer parte de lo que necesito(cuentas cuya ultima entrega sea mayor en días que x cantidad de días)...
Es decir que las dos cosas juntas no van en la misma consulta, por lo menos yo no pude lograrlo y por eso digo de hacer 2 consultas...
  #8 (permalink)  
Antiguo 24/01/2011, 07:02
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: Datediff - calcular días

En realidad, se puede, lo que sucede es que como se tata de datos excluyentes (lo que me dice que estás tratando de sacar un reporte entero en una sola consulta), la consulta se vuelve algo más compleja.
Podrías probar simplemente:
Código MySQL:
Ver original
  1.          P.nombre paciente,
  2.          C.codcuenta,
  3.          C.debe,
  4.          IFNULL(CH.fecha, '') fecha,
  5.          IFNULL(DATEDIFF(CURDATE(), CH.fecha), 0) dias
  6.         pacientes P
  7.         INNER JOIN cuenta C ON P.codpaciente = C.codpaciente
  8.         LEFT JOIN
  9.                 (SELECT codcuenta, MAX(fecha) fecha, estado, movimiento
  10.                 FROM cuentahistoria
  11.                 WHERE movimiento = 'E' AND estado = 'ALTA'
  12.                 GROUP BY codcuenta) CH ON C.codcuenta = CH.codcuenta
  13.        (DATEDIFF(CURDATE(), CH.fecha) > 11 AND c.debe > 0) OR CH.codcuenta IS NULL
  14. GROUP BY C.codcuenta
Esto es un mix entre ambas cosas. La idea es que devuelva los registros relacionados ente PACIENTE y CUENTA, y también con MOVIMIENTO, aunque sea NULL en este caso, pero si es NULL, los últimos dos campos del SELECT se convierten en vacío ('') y cero (=, ya que no existen datos que cumplan la condición.
Esta consulta se ordenará de tal forma que aquellos paciente que no tienen correspondencias en MOVIMIENTO aparezcan al final.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 24/01/2011, 09:42
mgd
 
Fecha de Ingreso: enero-2009
Mensajes: 129
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Datediff - calcular días

excelente, también había imaginado hacerlo parecido a lo que decís pero no había tenido éxito
Muchas gracias, funciona bárbaro
  #10 (permalink)  
Antiguo 24/01/2011, 09:53
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: Datediff - calcular días

__________________
¿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: datediff, calculadora
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 18:37.