Foros Club Delphi

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

El_Raso 05-03-2010 19:23:53

Consulta de fecha con hora, como?
 
Que tal a todos...

Mi problema es el siguiente, estoy usando Firebird 2.1 Dialecto 1 (la DB fue creada inicialmente asi) tengo lo siguiente:
Una tabla FACTURA con dos campos FECHA tipo Date y HORA tipo VARCHAR(13) ya que el dialecto 1 no soporta el tipo TIME.

El formato de la hora es del tipo 00:00 AM Ej. "12:56 PM" asi grabo el campo hora en la tabla.

Quiero hacer una consulta entre fechas que involucre la hora. Ej. del 03/04/2010 a las 12:34 AM hasta el 06/04/2010 04:12 PM y no me trae ningun dato. estoy usando el siguiente query:

select sum(b.montoneto), count(b.numerofactura) from factura b
where b.condicionfactura = 'CONTADO' and
b.estadofactura = 'PAGADA' and
b.fechafactura >= :FechaInicial and
b.fechafactura <= :FechaFinal and

b.horafactura >= :HoraInicio and
b.HoraFactura <= :HoraFin

Y le mando la hora y la fecha desde Delphi 2007 en el formato que especifique arriba. Para un solo dia me funciona y hasta de un dia para otro, pero si pase de dos dias la consulta no trae nada.

Una mano por favor...:confused:

Gracias

ContraVeneno 06-03-2010 17:48:31

¿podrías poner cómo lo estas haciendo el delphi?

El_Raso 07-03-2010 13:57:35

Código Delphi [-]
               FacturaHORAFACTURA.Value := FormatDateTime('hh:mm ampm',Time);
               FacturaFECHAFACTURA.Value := Date;
Es por el dialecto que estoy usando el 1 y no soporta el tipo TIME

Casimiro Notevi 07-03-2010 14:21:38

Debes usar también campos date para guardar la hora, te será mucho más cómodo, tan sólo que "desprecias" la fecha y te quedas con lo que te interesa, la hora.
Ten en cuenta que los campos date guardan un número tal como así: 38925,12569874
la parte entera, 38925, es la fecha contando desde el 31.12.1899 (creo recordar) y la parte decimal es la hora.
Si lo guardar como un varchar te estás complicando mucho.

elarys 11-03-2010 18:50:10

Se me ocurre que podes probar algo como esto

Fec_Ini := QuotedStr(FormatDateTime('dd/mm/yyyy', Fec_Ini)+' 00:00:00');
Fec_Fin := QuotedStr(FormatDateTime('dd/mm/yyyy', Fec_Fin)+' 23:59:59');

Donde te quedaria con la fecha de hoy por ejemplo
fechafactura >= '11/03/2010 00:00:00'
fechafactura <= '11/03/2010 23:59:59'

Incluso creo que deberia ser entre 00:00:01 y las 00:00:00 pero eso es algo que cada uno maneja y lo ve como quiere

O hacer directamente esto
Fec_Ini := QuotedStr(FormatDateTime('dd/mm/yyyy hh:mm:ss', Fec_Ini));
Fec_Fin := QuotedStr(FormatDateTime('dd/mm/yyyy hh:mm:ss', Fec_Fin));

Xcalibur 11-03-2010 20:29:25

Tienes un problema grave:

ya que la hora está siendo grabada como texto y en formato am/pm (para remate), resulta imposible comparar rangos de horas que crucen las 12:00 m, ejemplo:

06:33 AM es menor que 04:00 PM

pero

'06:33 AM' es MAYOR que '04:00 PM',

¿Como puede ser esto?

Muy sencillo: se están comparando textos (que representan horas pero siguen siendo literales), es decir '0' es igual a '0', pero '06' es MAYOR que '04', sin importar lo que siga a continuación ni el significado que tenga para nosotros.

Soluciones:

1.- Si tienes los fuentes del sistema en uso: (la más fácil)
1.1.- Cambia el formato de la hora grabada a 24 horas (04:00 PM = 16:00)
1.2.- Diseña una aplicación que recorra la tabla y actualice el campo con el nuevo formato.
1.3.- Usa el campo Hora para la consulta (en todo caso deberas hacer 3 clausulas):
WHERE ...
AND ((Fecha = :FechaInicial) AND (Hora >= :HoraInicial))
AND ((Fecha > :FechaInicial) AND (Fecha < :FechaFinal))
AND ((Fecha = :FechaFinal) AND (Hora<= :HoraFinal))

2.- No tienes los fuentes del sistema en uso: (la menos fácil)
2.1.- Agrega un campo (a la tabla Facturas claro) tipo VARCHAR (05) y lo llamas Hora24 o algo así.
2.2.- Crea un Trigger para la tabla "Facturas" que actualice dicho campo con la hora en formato 24H basado en el campo hora que se usa actualmente.
2.3.- Usa el nuevo campo Hora24 para la consulta (en todo caso deberas hacer 3 clausulas):
WHERE ...
AND ((Fecha = :FechaInicial) AND (Hora24 >= :HoraInicial))
AND ((Fecha > :FechaInicial) AND (Fecha < :FechaFinal))
AND ((Fecha = :FechaFinal) AND (Hora24<= :HoraFinal))

Bueno, me cansé.

Suerte...

El_Raso 18-03-2010 19:01:13

Con el metodo de elarys resolvi la situacion... Gracias a todos!!!


La franja horaria es GMT +2. Ahora son las 13:22:48.

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