domingo, 9 de noviembre de 2008

Añadir Minutos a TimeStamp en Firebird

Me encontraba moviéndole un poco al Firebird y resultó que necesito añadir X cantidad de minutos a la información contenida por una columna de tipo TimeStamp. Lo lógico era utilizar la unidad 1/3600 para obtener el decimal correspondiente a los minutos (como en cualquier otro DMBS), sin embargo, los intentos fueron infructosos ya que la operación no se ejecutaba correctamente.

Casi desesperado, recordé que debía poner ".0" a los números para que los tomara como decimales y no como enteros. Al realizar lo anterior me encontré que aunque las divisiones las realizaba correctas, solo funcionaban hasta cierta cantidad de decimales. Posteriormente encontré que por lo menos para las fechas, debía escribir el número resultado de la división para encontrar el valor decimal de los minutos en lugar de realizar la división dentro de la consulta, de manera que si quiero añadir 5 minutos a la fecha actual debo utilizar un query como el que aparece a continuación y en el que podrán ver el resultado de utilizar los dos métodos:

select current_timestamp,
current_timestamp+(1.0/3600.0)*5.0 as incorrecto,
current_timestamp+(0.0006944445*5.0) as correcto
from rdb$database;



La versión de Firebird que estoy utilizando es la 2.0 y es donde el query funciona como lo indico, es decir, que falla al realizar la división. Sin embargo, leo por allí que en la versión 2.1 ya han añadido funciones para trabajar más fácilmente con las fechas así como otro montón de funciones básicas que francamente me extraña que no hubieran sido añadidas anteriormente. Algunas de ellas las comentan en el Blog de Johny Suárez.

Las versiones 2.1 de Firebird (embedded, ADO.NET y Server) las pueden encontrar en el sitio de Firebird/IbPhoenix.

Debo comentar que tras haberlas instalado, y reiniciado mi computadora =) la base de datos y el query han funcionado sin problema. Podrían probar con este

select current_timestamp,
current_timestamp+(1.0/3600.0)*5.0 as incorrecto,
current_timestamp+(0.0006944445*5.0) as correcto,
dateadd(SECOND,5,current_timestamp) as mas_correcto
from rdb$database;

Espero que este pequeño post les sirva para ahorrarse dolores de cabeza: recuerden utilizar las versiones más actuales, checar diferencias entre versiones, y si van a realizar un cambio en una base de datos en producción pues hay que tomar las precauciones de necesarias antes de realizar el cambio tales como crear una copia de respaldo de nuestros datos y configuración.

1 comentario:

Unknown dijo...

Muchas gracias por tu post, es justo lo que estoy buscando