Crear una función en Firebird 2.x que nos devuelva una fecha en cualquier formato

3 comentarios

A veces podríamos llegar a necesitar representar a las fechas en diferentes formatos, por ejemplo a la fecha 28 de marzo de 2017 podríamos querer presentarla como:

  • 28/03/2017
  • 03/28/2017
  • 2017/03/28
  • 28-03-2017
  • 28-MAR-2017
  • 28/MAR/2017
  • 28 de marzo de 2017
  • etc.

¿Cómo podemos obtener la fecha en el formato que nos interesa?

En Firebird no existe una función llamada DATE_FORMAT() o equivalente como sí existe en Oracle y en MySQL, por ejemplo. Pero si necesitamos esa función entonces simplemente … podemos crearla.

Ya sabemos como escribir un stored procedure y usarlo como si de una función se tratara, lo hemos visto en el artículo:

https://firebird21.wordpress.com/2014/04/20/usando-un-stored-procedure-como-una-funcion/

Entonces, usaremos esa técnica para escribir nuestra propia función DATE_FORMAT()

Listado 1.

CREATE PROCEDURE DATE_FORMAT(
   tdFechax DATE,
   tcFormat VARCHAR(128))
RETURNS(
   ftcFecha VARCHAR(128))
AS
   DECLARE VARIABLE lnDia SMALLINT;
   DECLARE VARIABLE lnMes SMALLINT;
   DECLARE VARIABLE lnAno SMALLINT;
   DECLARE VARIABLE lcMes VARCHAR(128);
BEGIN

   tcFormat = UPPER(tcFormat);

   lnDia = EXTRACT(DAY FROM tdFechax);
   lnMes = EXTRACT(MONTH FROM tdFechax);
   lnAno = EXTRACT(YEAR FROM tdFechax);

   IF (tcFormat = '%D/%M/%Y') THEN
      ftcFecha = LPAD(lnDia, 2, '0') || '/' || LPAD(lnMes, 2, '0') || '/' || lnAno;

   IF (tcFormat = '%M/%D/%Y') THEN
      ftcFecha = LPAD(lnMes, 2, '0') || '/' || LPAD(lnDia, 2, '0') || '/' || lnAno;

   IF (tcFormat = '%Y/%M/%D') THEN
      ftcFecha = lnAno || '/' || LPAD(lnMes, 2, '0') || '/' || LPAD(lnDia, 2, '0');

   IF (tcFormat = '%D-%M-%Y') THEN
      ftcFecha = LPAD(lnDia, 2, '0') || '-' || LPAD(lnMes, 2, '0') || '-' || lnAno;

   IF (tcFormat = '%M-%D-%Y') THEN
      ftcFecha = LPAD(lnMes, 2, '0') || '-' || LPAD(lnDia, 2, '0') || '-' || lnAno;

   IF (tcFormat = '%Y-%M-%D') THEN
      ftcFecha = lnAno || '-' || LPAD(lnMes, 2, '0') || '-' || LPAD(lnDia, 2, '0');

   IF (tcFormat = 'NAME') THEN BEGIN
      lcMes = '';
      lcMes = IIF(lnMes =  1, 'Enero'     , lcMes);
      lcMes = IIF(lnMes =  2, 'Febrero'   , lcMes);
      lcMes = IIF(lnMes =  3, 'Marzo'     , lcMes);
      lcMes = IIF(lnMes =  4, 'Abril'     , lcMes);
      lcMes = IIF(lnMes =  5, 'Mayo'      , lcMes);
      lcMes = IIF(lnMes =  6, 'Junio'     , lcMes);
      lcMes = IIF(lnMes =  7, 'Julio'     , lcMes);
      lcMes = IIF(lnMes =  8, 'Agosto'    , lcMes);
      lcMes = IIF(lnMes =  9, 'Septiembre', lcMes);
      lcMes = IIF(lnMes = 10, 'Octubre'   , lcMes);
      lcMes = IIF(lnMes = 11, 'Noviembre' , lcMes);
      lcMes = IIF(lnMes = 12, 'Diciembre' , lcMes);
      ftcFecha = lnDia || ' de ' || lcMes || ' de ' || lnAno;
   END

   SUSPEND;

END;

Por supuesto que podrías agregar más formatos de fecha si lo deseas, en el Listado 1. se mostraron algunas de las posibilidades.

Ahora, cuando queremos ver a una fecha con alguno de los formatos que definimos en nuestro stored procedure lo haríamos así:

Listado 2.

SELECT
   F.ftcFecha
FROM
   RDB$DATABASE
LEFT JOIN
   DATE_FORMAT(CURRENT_DATE, '%D/%M/%Y') F
      ON 1 = 1

Captura 1. Si haces clic en la imagen la verás más grande

Listado 3.

SELECT
   F.ftcFecha
FROM
   RDB$DATABASE
LEFT JOIN
   DATE_FORMAT(CURRENT_DATE, '%Y-%M-%D') F
      ON 1 = 1

Captura 2. Si haces clic en la imagen la verás más grande

Listado 4.

SELECT
   F.ftcFecha
FROM
   RDB$DATABASE
LEFT JOIN
   DATE_FORMAT(CURRENT_DATE, 'NAME') F
      ON 1 = 1

Captura 3. Si haces clic en la imagen la verás más grande

Conclusión:

Aunque Firebird nativamente no tiene una función DATE_FORMAT o equivalente, es bastante sencillo realizar una, tal y como hemos podido ver en este artículo. Y aunque en nuestros ejemplos hemos usado la tabla RDB$DATABASE no es ninguna obligación utilizarla, puedes usar cualquier tabla que desees, también cualquier fecha que desees, y también cualquier formato que desees. Si ese formato no se encuentra en el Listado 1., pues lo agregas y listo.

Artículos relacionados:

Usando un stored procedure como una función

El índice del blog Firebird21

El foro del blog Firebird21

Fechas aleatorias

Deja un comentario

A veces cuando estamos realizando pruebas necesitamos datos aleatorios, o sea datos que pueden ser cualesquiera, no podemos anticipar cuales serán.

Supongamos que necesitamos fechas aleatorias. Para ello, como de costumbre usaremos la función RAND(). Esta función nos devolverá un número entre 0 y 0,999999. También usaremos la función FLOOR() que nos devuelve la parte entera de un número. También usaremos la función DATEADD() que le suma un número a una fecha para devolvernos una nueva fecha, la fecha original más la cantidad de días que le hemos sumado.

Veamos algunos ejemplos:

Listado 1. Fechas entre el 1 de enero de 2017 y el 31 de marzo de 2017

SELECT
   DATEADD(FLOOR(90 * RAND()) DAY TO DATE '2017-JAN-01')
FROM
   RDB$DATABASE

Explicación:

La cantidad de días posibles es 90, así que multiplicamos a RAND() por 90. La cantidad de días debe ser un número entero, así que usamos la función FLOOR(), porque la función RAND() nos devuelve un número con decimales. Lo que estamos sumando son días así que usamos DAY, la fecha la expresamos como un string así que debemos convertirla a tipo fecha con DATE.

En síntesis, lo que estamos diciendo es: muéstrame una fecha aleatoria entre el 1 de enero de 2017 y el 31 de marzo de 2017

Listado 2. Fechas entre el 1 de enero de 2017 y el 31 de diciembre de 2017

SELECT
   DATEADD(FLOOR(365 * RAND()) DAY TO DATE '2017-JAN-01')
FROM
   RDB$DATABASE

Explicación:

Como la cantidad de días posibles es 365, entonces multiplicamos a 365 por RAND()

Listado 3. Fechas entre el 1 de abril de 2017 y el 30 de abril de 2017

SELECT
   DATEADD(FLOOR(30 * RAND()) DAY TO DATE '2017-APR-01')
FROM
   RDB$DATABASE

Explicación:

Como la cantidad de días posibles es 30, entonces multiplicamos 30 por RAND(). Como la fecha inicial es el 1 de abril de 2017, entonces escribimos esa fecha después de DATE.

Artículos relacionados:

La función DATEADD()

La función FLOOR()

La función RAND()

El índice del blog Firebird21

El foro del blog Firebird21

Liberada la versión 3.0.2 de Firebird

3 comentarios

El día 22 de marzo de 2017 fue liberada la versión 3.0.2 de Firebird, la cual ha corregido muchos “bugs” que se encontraron desde la liberación de la versión 3.0.0 y además tiene algunas mejoras en cuanto a rendimiento. Por lo tanto, si ya estás usando Firebird 3 es altamente  recomendable que descargues e instales esta nueva versión.

Puedes descargarla desde:

https://www.firebirdsql.org/en/firebird-3-0-2/

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

Liberada la versión 2.5.7 de Firebird

5 comentarios

El 15 de Febrero de 2017 se liberó la versión 2.5.7 de Firebird, la cual tiene las siguientes mejoras:

  1. Se corrigió una vulnerabilidad que ocurría cuando se realizaban conexiones autenticadas. Como las conexiones autenticadas no son muy usadas por los administradores de bases de datos de Firebird el riesgo en general no era muy grande, pero igualmente es muy conveniente actualizarse a la versión 2.5.7
  2. Ahora se pueden filtrar la información y los avisos de advertencia del trace log
  3. Se agregó soporte para “TCP Loopback Fast Path”, el cual fue introducido en Windows 8 y en Server 2012, lo cual mejorará las velocidades en redes locales que usen esos sistemas operativos o versiones posteriores.

Puede ser descargado desde:

https://www.firebirdsql.org/en/firebird-2-5/

Artículos recomendados:

El índice del blog Firebird21

El foro del blog Firebird21