Ver Mensaje Individual
  #4  
Antiguo 09-06-2011
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Reputación: 21
gluglu Va por buen camino
Hola Casimiro ....

Ya he hecho más pruebas y ya tengo explicación !

Respecto de la fecha del servidor, indiqué que utilizo Win XP, y cambiando la fecha del sistema, me cambio 100% la fecha del servidor Firebird que está en la misma máquina, porque cualquier select que hago con el IBExpert me devuelve la fecha correcta.

Bueno, explico ya lo que yo creo que pasa ....

Utilizo el 'Date' delante porque en muchas partes del SP completo (que no lo puse porque son unos cientos de líneas), hago muchas operaciones de fechas, y en la mayoría de los casos, si no utilizo el 'Date' para convertir el String 'TODAY' en una fecha, el compilador me lanza un error.

Al simplificar a una única línea mi SP, llegué al que indiqué arriba, y las pruebas de hecho las estaba realizando con Date 'TODAY'.

Al parecer, de esta manera lo que hace el compilador del SP, es convertir en el momento de compilar la variable 'TODAY' del sistema (es decir, la fecha actual), en un 'Date' y directamente lo graba en la propia BBDD. Lo que provoca, al parecer, que cada vez que se compila, el SP cambia y graba la fecha del momento en que se compila, hasta la próxima compilación, que es lo que me ocurría.

Este problema se soluciona, o bien utilizando Current_Date, o bien, como tu dice, quitando el Date de delante, con lo que al ser una variable de Output definida como tipo fecha, no dá error al compilar. Y lo he comprobado, y sin 'Date' delante funciona correctamente. Claro, ya no convierte el compilador un valor concreto al compilar, sino que funciona como debe de funcionar, y cada vez que se ejecuta el SP, devuelve la fecha correcta del sistema.

Pero mi problema en el SP general era que tenía que hacer un Select con una operación de fechas que implicaba el 'Today'.

Código SQL [-]
For Select distinct case when AW.TYPE_Q_RELEASE = 1
                         then Current_Date + AW.Q_RELEASE
                         else Current_Date + (AW.Q_RELEASE * 7)
                    end
    from AVAIL_WARNINGS AW
    where AW.DATETO >= 'TODAY'
    and AW.Q_RELEASE  is not null
    and AW.CATEGORYNO = :AVW_CATEGORYNO
    into AVW_DATE
do begin
  ...

En este caso, si en vez de Current_Date, como ahora finalmente ha quedado, utilizaba 'TODAY', el compilador lo tomaba como String y me lanzaba un error. Por eso, como en otras muchas partes, decidí poner Date 'Today' (donde ahora pone Current_Date) para que el Select funcionara. Y el compilador no daba error y todo perfecto.

Pero al funcionar normalmente con datos, los resultados eran incongruentes. Debo de concluir que de nuevo el compilar cogía, y grababa directamente en el SP el 'Date 'Today'' como un valor concreto, cogiendo la fecha del sistema en el momento de la compilación.

Concluyo que, de acuerdo con la documentación de Firebird, si el 'TODAY' va en los campos que debe de devolver un Select, se ha de utilizar Current_Date, y en cualquier otra parte del SP, o del propio Select (por ejemplo en el Where), se puede utilizar igualmente 'TODAY', que en ese caso para que no se interprete como un String, deberá llevar delante el 'Date'.

Pero claro, esto sólo ocurre en los SP, que deben de ser compilados y grabados en la BBDD. Porque en cualquier sentencia normal SQL,
Código SQL [-]
Select Date 'TODAY' from ...
funciona perfecta y correctamente.

De hecho, en el Select normal (que no va dentro de un SP), si se utiliza sólo 'TODAY', te devuelve un String, y para que te devuelva la fecha correcta, o bien pones 'Date' delante, o hace un Cast a tipo fecha,
Código SQL [-]
Select Cast('Today' as Date) from ...

.... lo que pasa que me ha llevado casi 6 - 7 horas encontrar esta explicación y poder explicar los resultados incongruentes que me devolvía el SP.

Espero que pueda servir a cualquier otra persona que en algún momento se encuentre con un problema parecido !

Saludos y gracias !
__________________
Piensa siempre en positivo !
Responder Con Cita