Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-11-2007
Avatar de Adrian Murua
Adrian Murua Adrian Murua is offline
Miembro
 
Registrado: Oct 2003
Ubicación: Tucuman - Argentina
Posts: 44
Poder: 0
Adrian Murua Va por buen camino
Cool 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.
__________________
Adrián Murúa.
Responder Con Cita
  #2  
Antiguo 18-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: Dec 2004
Ubicación: Alcobendas, Madrid, España
Posts: 12.656
Poder: 27
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.davidesperalta.com
Responder Con Cita
  #3  
Antiguo 18-11-2007
Avatar de Adrian Murua
Adrian Murua Adrian Murua is offline
Miembro
 
Registrado: Oct 2003
Ubicación: Tucuman - Argentina
Posts: 44
Poder: 0
Adrian Murua Va por buen camino
Cool 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.
__________________
Adrián Murúa.
Responder Con Cita
  #4  
Antiguo 18-11-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: Jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 20
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 18-11-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: Dec 2004
Ubicación: Alcobendas, Madrid, España
Posts: 12.656
Poder: 27
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.davidesperalta.com
Responder Con Cita
  #6  
Antiguo 18-11-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: Jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 20
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 19-11-2007
Avatar de Adrian Murua
Adrian Murua Adrian Murua is offline
Miembro
 
Registrado: Oct 2003
Ubicación: Tucuman - Argentina
Posts: 44
Poder: 0
Adrian Murua Va por buen camino
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.
__________________
Adrián Murúa.
Responder Con Cita
  #8  
Antiguo 19-11-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: Jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 20
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 19-11-2007
Avatar de Adrian Murua
Adrian Murua Adrian Murua is offline
Miembro
 
Registrado: Oct 2003
Ubicación: Tucuman - Argentina
Posts: 44
Poder: 0
Adrian Murua Va por buen camino
Voy a probar lo que me dices y despues comento los resultados ...

Gracias.
__________________
Adrián Murúa.
Responder Con Cita
  #10  
Antiguo 19-11-2007
Avatar de Adrian Murua
Adrian Murua Adrian Murua is offline
Miembro
 
Registrado: Oct 2003
Ubicación: Tucuman - Argentina
Posts: 44
Poder: 0
Adrian Murua Va por buen camino
Cool

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.
__________________
Adrián Murúa.
Responder Con Cita
  #11  
Antiguo 19-11-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: Jul 2004
Ubicación: Salta, Argentina
Posts: 5.598
Poder: 20
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta por fecha en MySQL y Delphi rodrigodeoz Conexión con bases de datos 2 17-10-2007 17:47:39
Extraccion fecha de un campo fecha y hora matti Firebird e Interbase 3 26-04-2007 20:48:11
Juntar fecha y hora para consulta SQL Iuconlas SQL 6 21-02-2007 13:16:40
Error en consulta con fecha y hora. Tecnic2 SQL 10 01-10-2005 02:35:25
fecha y hora i_berbeu C++ Builder 7 21-09-2005 00:07:08


La franja horaria es GMT +2. Ahora son las 00:55:55.


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