Ir al contenido


Foto

Como comparar fechas y horas en el mismo select en FB ??


  • Por favor identifícate para responder
7 respuestas en este tema

#1 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 15 septiembre 2012 - 09:45

Buenas tardes compañeros, ya tenia rato que no agragaba un tema nuevo, aqui ando dandoles lata  (h)

Tengo una tabla que el fin de ella es meter promociones, es decir, cuando quieren poner ciertos productos a la venta con descuentos, y tengo 4 campos, FechaIni, HoraIni, FechaFin, HoraFin, para que se active y desactive sola la promoción.

Ahora bien, en cuando a comparar fechas no tengo problema, tengo este select:

SELECT *FROM PROMOCIONESD D
WHERE
  PRODUCTO = '54' AND

  FECHA_INI <= (SELECT FECHA FROM sp_FECHASERVIDOR) AND
  FECHA_FIN >= (SELECT FECHA FROM sp_FECHASERVIDOR)
  /*
  HORA_INI <= (SELECT HORA FROM sp_HORASERVIDOR) AND
  HORA_FIN >= (SELECT HORA FROM sp_HORASERVIDOR)
*/

Estoy comparando la fecha y hora del servidor FB, para mayor seguridad, si comparo la fecha funciona, pero me falta ver como comparo la hora si hago el mismo tratamiento que la fecha no me funciona... Hay una forma de concatenar la fecha y la hora para hacer la comparacion ??

  • 0

#2 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 15 septiembre 2012 - 10:02

Saludos Agag,,

No se si entendi mal o asi es como lo tienes, pero creo que tienes mal definidos los comparadores..

Pudieras probar con esto..



SELECT *FROM PROMOCIONESD D
WHERE
  PRODUCTO = '54' AND
(  (SELECT FECHA FROM sp_FECHASERVIDOR) BETWEEN  FECHA_INI  AND FECHA_FIN  ) 
  AND
  (SELECT HORA FROM sp_HORASERVIDOR)  BETWEEN  HORA_INI AND HORA_FIN )
)
*/




  • 0

#3 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 15 septiembre 2012 - 11:39

Lo esas haciendo al reves, la idea es tomar todos los registros que esten entre el rango de fecha y hora ACTUAL.
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 septiembre 2012 - 12:21

Hola Agag4,
Si tu campos fuera del tipo TIMESTAMP (requiere dialecto 3, que es lo más recomendado) puedes trabajar de forma más simple ya que éste puede registrar fecha y hora. De allí que baste con hacer una evaluación con BETWEEN para que funcione.

Si deseas mantener separada la fecha y hora deberás hacer una doble comparación, sólo debes de añadir a las condiciones la parte de las horas. Por ejemplo:

(FechaIni >= FechaServer) AND (HoraIni >= HoraServer)

Y lo mismo para con FechaFin y HoraFin.

Ahora bien esto requiere que se descomponga la fecha y hora del server. Firebird dispone de las variables de entorno/contexto CURRENT_DATE, CURRENT_TIME y CURRENT_TIMESTAMP para obtener la fecha, la hora y fecha/hora respectivamente.

Mi consejo: utiliza campos timestamp... te hacen más fácil las cosas.

Saludos,
  • 0

#5 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 15 septiembre 2012 - 12:37

Uso dialecto 3, y muchas Gracias, eso voy hacer entonces, otra duda, como lo separo en delphi ?? es decir, ahorita tengo un componente para fecha y otro para la hora, si voy a usar un campo timestamp para guardar las 2 cosas, en delphi como guardo esos 2 datos ?? asi ??


delphi
  1.   TablaFecHr_Ini.Value := edFechaIni.text + edHoraIni.text;
  2.   TablaFecHr_Fin.Value := edFechaFin.text + edHoraFin.text;



Corrección...



delphi
  1.   (FechaIni >= FechaServer) AND (HoraIni >= HoraServer)



Es al reves  :|

seria asi:


delphi
  1.   (FechaIni <= FechaServer) AND (HoraIni <= HoraServer)



Supongamos que la FecIni = 10/09/2012 , la HoraIni = 08:00 am

Si (10/09/2012  <= 15/09/2012) AND (08:00 am <= 11:00 am)

Gracias.
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 15 septiembre 2012 - 11:58

Hola Agag4,
Si utilizas dialecto 3 como indicas entonces corta por lo sano: cambia los tipos de los campos a timestamp.

Luego en Delphi dispones de un buen componente para ingresar fechas y/o horas: TDateTimePicker.
Puedes disponer de 2 grupos de 2 TDateTimePicker (es decir, 4): el primer par para formar la fecha y hora de inicio y el 2do par para de fin.
Explico medianamente el uso del componente, la propiedad Kind establece si ha de ingresar fecha u hora. Dependiendo del caso el componente adquiere una forma u otra. Ofrece un diseño bastante minimalista así que no te preocupes.
Luego tiene las propiedades .Date, .Time y DateTime para leer o establecer una fecha, hora y Fecha/Hora determinada. Cuando estableces en kind el valor dtkDate al leer la propiedad DateTime se tendrá la fecha seleccionada con la hora establecida previamente o la de por defecto. En forma inversa, si está establecido en dtkTime, al leer la propiedad DateTime se leerá la hora seleccionada con la fecha establecida previamente o la de por defecto.
Entonces, cuando uno está en dtkDate, es más conveniente utilizar la propiedad Date para no leer una "hora basura". Y lo análogo para cuando está en dtkTime.

La pregunta aquí es ¿como entonces obtener una fecha/hora según dos TDateTimePicker? Fácil, estableces la hora seleccionada en el TDateTimePicker en modo dtkTime al TDateTimePicker que esté en modo dtkDate. Por ejemplo:



delphi
  1. dtpr1.Time := dtpr2.Time;



Y luego mostramos leyendo desde la propiedad DateTime del TDateTimePicker para la fecha:



delphi
  1. ll1.Caption := DateTimeToStr(dtpr1.DateTime);



O de forma análoga, pasas la fecha hacia el de las horas, y luego procedes a leer la propiedad DateTime de éste.

Una ves que ya tienes formada la fecha/hora en cualesquiera de tus componentes tanto para la de inicio como de fin sólo debes pasar el dato a los parámetros de tu query. Por ejemplo:



delphi
  1. qy1.ParamByName(FechaHoraIni).AsDateTime := dtpr1.DateTime;
  2. qy1.ParamByName(FechaHoraIni).AsDateTime := dtpr3.DateTime;



Espero que se entienda.

Saludos,
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 16 septiembre 2012 - 10:02

Muy buena la solución que te da Delphius.
En caso de que necesites más control sobre tus Fechas y Horas, Delphi dispone de dos procedimientos para decodificar las fechas:



delphi
  1. //Para decodificar fechas
  2. procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);



El cual puedes usar así:


delphi
  1. var  Y, M, D: Word;
  2.  
  3. DecodeDate(TuFecha, Y, M, D);
  4. ShowMessage('El mes de tu fecha es :' +IntToStr(M))
  5. //Igual puede hacer uso de las otras variables



Y este otro para decodificar horas:



delphi
  1. procedure DecodeTime(Date: TDateTime; var Hour, Min, Sec, MSec: Word);



Que puede usar así:



delphi
  1. var  Hora, Min, Sec, MSec : Word;
  2.  
  3. DecodeTime(TuFecha, Hora, Min, Sec, MSec);
  4.  
  5. Showmessage('La hora de tu fecha es: ' +IntTostr(Hora))
  6. //Igual puede hacer uso de las otras variables



Ahora, bien podrías manipularlos directamente desde Firebird usando la función EXTRACT,  observa la imagen con la respectiva tabla:


SELECT EXTRACT (HOUR FROM TuCAmpodeFechaHora) AS TuHora FROM TuTabla

Archivos adjuntos


  • 0

#8 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 16 septiembre 2012 - 02:59

Muchas gracias compañeros, voy a usar el timestamp, es mucho mejor....
  • 0




IP.Board spam blocked by CleanTalk.