viernes, 5 de mayo de 2023

Oracle 23c - Soporte de tipo de datos DATE, TIMESTAMP e INTERVAL en funciones CEIL y FLOOR

Otra interesante mejora en Oracle 23c es la posibilidad de usar las funciones FLOOR y CEIL (las cuales devuelven el valor redondeado hacia abajo o hacia arriba) con los tipos de datos DATE, TIMESTAMP e INTERVAL, además de usarlas con datos numéricos como era posible hasta ahora.


Nota: para poder ver los resultados correctos de los ejemplos mostrados en el artículo, es recomendable configurar las variables de sesión de formato de fecha de la siguiente manera:

ALTER SESSION SET nls_date_format='DD-MM-YYYY HH24:MI:SS'; ALTER SESSION SET nls_timestamp_format='DD-MM-YYYY HH24:MI:SS.FF3';


FLOOR y CEIL con DATE

En el siguiente ejemplo, vamos a mostrar el uso de ambas funciones con el tipo de datos DATE. La sintaxis mas sencilla es la siguiente:

SELECT SYSDATE AS Fecha_Hora,
    FLOOR(SYSDATE) AS FLOOR_SYSDATE,
    CEIL(SYSDATE) AS CEILING_SYSDATE;

Y al ejecutar la misma obtenemos el siguiente resultado:


Ambas funciones permiten el uso de un modificador de formato, en el cual podemos especificar si queremos redondear (hacia arriba o hacia abajo) con una unidad de medida distinto al valor por defecto que, como toda la aritmética de fechas en Oracle, se basa en días. El ejemplo siguiente muestra como redondear hacia abajo en minutos y como redondear hacia arriba en horas:

SELECT SYSDATE AS Fecha_Hora,
    FLOOR(SYSDATE, 'MI') AS FLOOR_SYSDATE,
    CEIL(SYSDATE, 'HH24') AS CEILING_SYSDATE;

Podemos ver el resultado de ejecutar la sentencia:


Nota
: para ver los formatos aceptados por estas funciones ver el artículo CEIL, FLOOR, ROUND, and TRUNC Date Functions en la documentación oficial.


FLOOR y CEIL con TIMESTAMP

La sintaxis es exactamente igual, y podemos ver el mismo ejemplo usando modificadores de formato pero esta vez con el tipo de dato TIMESTAMP:

SELECT CURRENT_TIMESTAMP AS Fecha_Hora,
    FLOOR(CURRENT_TIMESTAMP,'MI') AS FLOOR_TIMESTAMP,
    CEIL(CURRENT_TIMESTAMP,'HH24') AS CEILING_TIMESTAMP;

Obteniendo estos resultados:


Nota: ambas funciones aceptan valores de entrada de tipo TIMESTAMP, pero devuelven valores de tipo DATE, como se ve en la imagen al no incluir fracciones de segundos.


FLOOR y CEIL con INTERVAL

Por último, vamos a aplicar las funciones a datos de tipo INTERVAL, para ellos usamos una CTE que simula una tabla con una columna de este tipo de datos, y le aplicamos ambas funciones con modificadores de formato para redondear a minutos hacia abajo y redondear a horas hacia arriba:

WITH vData AS (SELECT INTERVAL '0 05:23:14.333' DAY TO SECOND AS Intervalo) SELECT Intervalo,
    FLOOR(Intervalo,'MI') AS FLOOR_INTERVAL,
    CEIL(Intervalo,'HH24') AS CEILING_INTERVAL FROM vData;

Obteniendo el siguiente resultado:


Conclusión

Si bien la función FLOOR puede reemplazarse sin problemas por TRUNC (en todos los ejemplos mencionados devuelve el mismo resultado) la posibilidad de usar la misma así como usar CEILING con tipos de datos adicionales a los numéricos es una ventaja que facilita el desarrollo de código SQL a partir de Oracle 23c.


Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:

Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.


No hay comentarios.:

Publicar un comentario