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 |
¿podrías poner cómo lo estas haciendo el delphi?
|
Es por el dialecto que estoy usando el 1 y no soporta el tipo TIME |
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. |
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)); |
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... |
Con el metodo de elarys resolvi la situacion... Gracias a todos!!!
|
La franja horaria es GMT +2. Ahora son las 16:01:50. |
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