Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta MySQL con fecha y hora (https://www.clubdelphi.com/foros/showthread.php?t=50454)

Adrian Murua 18-11-2007 19:30:47

Consulta MySQL con fecha y hora
 
Estimados Amigos :

Tengo una consulta SqL (MySQL) donde tengo que seleccionar todos lo registros de una tabla con las siguientes restricciones:

La tabla de llama Operaciones, aparte de algunos campos , tiene un campo fecha (de tipo Fecha ) y un campo "Inicio" y un "Final" (de tipo Time), estos campos dan la fecha de la operacion( estas operaciones son ordenes de ejecucion de eventos de una fabrica) la hora de inicio del evento y la hora de final del evento.

Necesito mostrar en una grilla todos los eventos del dia, y los dias siguientes, excepto aquellos cuya hora de terminacion del evento (Campo Final) ya se han ejecutado (es decir que la hora final sea menor que la actual, en el dia d e la fecha).

Hice una consulta asi:
Código SQL [-]
Select * From Operaciones Where ( Fecha >= Fecha_hoy ) and ( Final >= Hora_actual )

Por supuesto que Fecha_hoy y Hora_actual son variables que guardan las fecha y hora respectivamente.

Teoricamente lo que deseo hacer es : que me filtre los registros que pertenezcan al dia de la fecha y los de los dias posteriores. y que de este subconjunto de datos me muestre los eventos que no se han ejecutado aun, es decir que la hora Final sea menor o igual que la hora actual.

Por supuesto que la consulta anterior no me da los resultados que espero.

En teoria . lo que pienso es algo como :

"
SELECCIONAR TODOS LOS REGISTROS DE LA TABLA OPERACIONES QUE CUMPLAN CON :

SI SON MAYORES O IGUALES A LA FECHA ACTUAL, ENTONCES MOSTRAR LOS QUE EN SU CAMPO FINAL SEAN MAYORES O IGUALES QUE LA HORA ACTUAL.

"

La verdad no se como plasmar esto en una consulta Sql.

Si alguien tiene una sugerencia, le estaria agradecido.


desde ya muchas Gracias.

dec 18-11-2007 19:56:29

Hola,

Yo no estoy muy puesto, pero, lo mismo puedes aprovechar ciertas funciones de MySQL y escribir algo parecido a esto:

Código SQL [-]
Select * From Operaciones Where ( Fecha >= CURRENT_DATE() ) and ( Final >= CURRENT_TIME() )

Echa un vistazo al apartado de funciones de tiempo de MySQL en la web MySQL.ConClase.net.

Adrian Murua 18-11-2007 22:27:40

Gracias por responder
 
Gracias por responder, lo que me sugieres es algo pareccido a lo que hice, lo que pasa es que haciendolo de esa forma, tengo el siguiente problema:

Supongamos que queremos mostrar todos los registro del dia de hoy "18-11-2007" y cuya hora de fin del evento sea mayor o igual a las "18:00:00", entonces haciendo la consulta anterior, o la que vos me propones:

Código SQL [-]
 Select * From Operaciones Where ( Fecha >= CURRENT_DATE() ) and ( Final >= CURRENT_TIME() )
.

Los resultados son los siguientes :

1- Me muestra todos los registros cuya fecha es >= CURRENT_DATE (18-11-2007 en nuestro ejemplo.), hasta aqui todo va muy bien.

2- Me muestra tambien todos los registro cuya Fecha que son mayores a CURRENT_DATE. Hasta aqui tambien estamos muy bien.

3- Pero.. ME muestra en los registros cuya Fecha es Mayor que CURRENT_DATE, solamente aquellos que son mayores o iguales a CURRENT_TIME, siendo que aqui tiene que mostrar todos los registros que son mayores que CURRENT_DATE, pues son eventos que todavia no se han ejecutado.

Solamente cuando la fecha es igual al CURRENT_DATE, tendria que comparar que se cumpla que el campo Final sea >= que CURRENT_TIME.

Espero haber explicado mejor lo que quiero hacer..

Muchas Gracias por su tiempo.

Delphius 18-11-2007 22:39:38

Hola Adrian Murua,
Dejame ver si te entiendo...
¿Deseas que te devuelva los registros que sean mayores o iguales a la fecha actual (campo Fecha) y EN CASO DE SER IGUAL, que devuelva aquellos en los que la fecha final sea mayor o igual a la fecha actual?

¿Es decir que tu buscas una condición así?:

Código SQL [-]
(Fecha >= CURRENT_DATE) AND ((Fecha Final >= CURRENT_DATE) AND (Fecha = CURRENT_DATE))

Repito, no se si te logré haber entendido...
¿Porque no pones un ejemplo ilustrativo de lo que buscas hacer? Esto puede ser de ayuda tanto para ti como para nosotros para poder comprenderte.

Saludos,

dec 18-11-2007 22:40:02

Hola,

No me queda muy claro el asunto. No sé si podrías usar algún tipo de instrucción condicional en la consulta (no estoy muy puesto pero creo que son posibles), o bien bastaría que cambiaras los operadores actuales... pero esto ya se te habría ocurrido a ti.

Quiero decir:

Cita:

Solamente cuando la fecha es igual al CURRENT_DATE, tendria que comparar que se cumpla que el campo Final sea >= que CURRENT_TIME.
Dicho así, pareciera que en lugar de hacer "fecha >= CURRENT_DATE()" debería ser algo como: "fecha = CURRENT_DATE()". ¿No? Me da la impresión de que me estoy perdiendo algo, ya te digo que pongo más voluntad que otra cosa.

No sé yo si, en todo caso, y, si lo que digo no te apaña (que no lo hará) tal vez podrías usar instrucciones condicionales... pero,... a ver si algún compañero más puesto en el tema puede ofrecer su punto de vista. :)

Delphius 18-11-2007 22:47:26

Listo, ya comprendí el asunto.
La verdadera condición debe ser así:

Código SQL [-]
(Fecha > CURRENT_DATE) OR ((Fecha = CURRENT_DATE) AND (Fecha Final >= CURRENT_DATE))

Lo que se busca es devolver aquellos registros de tareas sin cumplir. Es decir aquellos que tienen asignado una fecha mayor a la actual o en su defecto, que se estén realizando pero que su fecha de finalización sea mayor o igual a la del día en curso.

Saludos,

Adrian Murua 18-11-2007 23:02:37

El Campo final es un campo de tipo TIME , me devuelve la hora de Finalizacion del evento, existe otro campo Inicio de tipo TIME que guarda la hora de inicio del evento.

Despues esta el campo de Tipo DATE, "Fecha", que me indica la fecha del evento.

Tengo 2 situaciones :

1- En el Dia de Hoy (o en el dia de la fecha).
Me tiene que mostrar todos los eventos del dia cuya hora de finalizacion( CAmpo Final ) sea mayor que la actual (CURRENT_TIME).

2- En los Dias que son mayores que Hoy ( es decir Mañana, pasado mañana, etc.)
Me tiene que mostrar todos los Eventos de esos dias.

Aqui les dejo la consulta real, que no la ponia antes para no complicarla mas .
Código SQL [-]
SELECT 
  `Operaciones`.OperacionID,
  `Operaciones`.ClienteID1,
  `Operaciones`.ClienteID2,
  `Operaciones`.PrestadorID2,
  `Operaciones`.PrestadorID1,
  `Operaciones`.Code,
  `Operaciones`.Codemd5,
  `Operaciones`.Nombre_inv,
  `Operaciones`.Email,
  `Operaciones`.Horas,
  `Operaciones`.Origen,
  `Operaciones`.Destino,
  `Operaciones`.Fecha,
  `Operaciones`.Inicio,
  `Operaciones`.Final,
  `Operaciones`.Texto,

FROM Operaciones

WHERE
  ( ((`Operaciones`.ClienteID1 = ". $ClienteID .") or (`Operaciones`.ClienteID2 = ". $ClienteID .")) and (`Operaciones`.Borrado = 0) and 
  (`Operaciones`.Fecha >= '". $fecha_hoy ."' )  and ( `Operaciones`.Final ='".date("H:i:s") . "'  ) and ( `Operaciones`.Confirmado = 0 )  )
  ORDER BY
  `Operaciones`.Fecha");
Uso PHP / MySQL .

Gracias.

Delphius 18-11-2007 23:10:52

Adrían ¿Probaste cambiando las condiciones de la fecha como la última que te indiqué?

Básicamente la idea es que devuelvas los registros que cumplan la condición:
1. Que la fecha sea mayor a la actual
2. O bien, que sea igual a la actual pero que su fecha de finalización sea mayor o igual a la actual.

Debería funcionarte con las condiciones que te señalo.

Saludos,

Adrian Murua 18-11-2007 23:14:14

Voy a probar lo que me dices y despues comento los resultados ...

Gracias.

Adrian Murua 18-11-2007 23:45:25

Probe lo que me dijiste Delphius, me funciona bien, por lo menos hasta ahora ;) , lo unico que sucede ahora es que me duplica el registro, es decir me muestra 2 veces el mismo registro, en la tabla se encuentra una vez. aqui la consulta :

Código SQL [-]
SELECT 
  Operaciones.OperacionID,
  Operaciones.ClienteID1,
  Operaciones.ClienteID2,
  Operaciones.PrestadorID2,
  Operaciones.PrestadorID1,
  Operaciones.Code,
  Operaciones.Codemd5,
  Operaciones.Nombre_inv,
  Operaciones.Email,
  Operaciones.Horas,
  Operaciones.Origen,
  Operaciones.Destino,
  Operaciones.Fecha,
  Operaciones.Inicio,
  Operaciones.Final,
  Operaciones.Importe,
  Operaciones.Borrado,
  Operaciones.Confirmado,
  Idiomas.IdiomaID,
  Idiomas.Nombre,
  Idiomas.Activo,
  Idiomas1.IdiomaID,
  Idiomas1.Nombre,
  Idiomas1.Activo,
  Clientes.Apellido,
  Clientes.Nombre
FROM
  Operaciones
  INNER JOIN Idiomas ON (Idiomas.IdiomaID =Operaciones.Origen )
  INNER JOIN Idiomas Idiomas1 ON ( Idiomas1.IdiomaID=Operaciones.Destino )
  INNER JOIN Clientes ON ((Clientes.ClienteID = Operaciones.ClienteID1) OR (Clientes.ClienteID = Operaciones.ClienteID2))
WHERE
((Operaciones.ClienteID1 = 1) OR  (Operaciones.ClienteID2 = 1)) AND  
  Operaciones.Borrado = 0 AND 
  Operaciones.Confirmado = 0 AND 
  ((Operaciones.Fecha > '2007-11-19') OR ((Operaciones.Fecha = '2007-11-19') AND 
   (Operaciones.Final > '05:33:20' )))
uso PHP / Mysql.

Gracias por todo.

Delphius 19-11-2007 05:32:08

Me parece raro que te muestre dos veces el mismo registro. Añade la sentencia distinct (al menos es así en SQL Server). No se si será así en MySQL porque no lo manejo.

Lo que hace distinct es eliminar los repetidos.

Saludos,


La franja horaria es GMT +2. Ahora son las 04:34:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi