Skip to main content

Command Palette

Search for a command to run...

[26ai] SQL: Calendar functions/Aggregation Filters "CALENDAR"

Updated
2 min readView as Markdown
[26ai] SQL: Calendar functions/Aggregation Filters "CALENDAR"
D

Ingeniero informático, Oracle ACE, DBA y Arquitecto OCI, con más de 15 años de experiencia en plataformas Oracle. Certificado en OCI Certified Architect Professional y OCI Migration and Integration Certified Professional.

En el artículo de hoy vamos a ver las Calendar functions en 26ai, diseñadas para simplificar la "vida" a los desarrolladores. Antes de su existencia, esto se resolvía con ingeniosas combinaciones usando case, subquerys o incluso condiciones de agregación. Haciendo todo ello, en algunos casos, una combinación perfecta para hacer consultas con cierta complejidad.

Estás extensiones formar parte de SFA Initiative (Select for Analysis), diseñadas para alinear más el Oracle SQL a los estándares.

A continuación puedes ver un gráfico ilustrativo de algunas de las distintas funciones que se han incorporado.

¿Cuándo debemos usarlas?

  • Cuando necesitamos agrupar en consultas analíticas por algún tipo de calendario descrito en el punto anterior.

  • Series temporales entre un rango de fechas.

  • Conversión del dato a nivel de columna.

  • Operaciones a nivel de un calendario, como agregar días o semanas.

Antes de empezar este laboratorio, debemos estar con la última versión de Oracle 23.26.2.

SQL> Select banner from v$version;

BANNER
--------------------------------------------------------------
Oracle AI Database 26ai Enterprise Edition Release 23.26.2.0.0 - Production

Para tener algo de información en nuestra PDB, vamos a cargar el schema de HR. Los scripts de este schema se encuentran en el github de Oracle Sample Projects.

Dejo aquí el enlace:

Github Oracle Sample Projects

El modelo ER es el siguiente:

CALENDAR

%_Year

Vamos a ver como interpreta cada una de estas funciones usando la misma columna de tipo date sin necesidad de restructurar nada.

SQL> 
select EMPLOYEE_ID,
       calendar_year(START_DATE) calendar,
       fiscal_year(START_DATE)   fiscal,
       retail_year(START_DATE)   retail,
       START_DATE,END_DATE,JOB_TITLE,MIN_SALARY,MAX_SALARY
from HR.JOB_HISTORY NATURAL JOIN (Hr.JOBS)
  fetch first 10 rows only

También pueden ser usadas para filtrar el resultado:

SQL> 
Select    EMPLOYEE_ID,START_DATE,END_DATE,JOB_TITLE,MIN_SALARY,MAX_SALARY
from HR.JOB_HISTORY NATURAL JOIN (Hr.JOBS)
where calendar_year(START_DATE) = 2011
  fetch first 10 rows only

En este caso podíamos usar un Extract(Year from START_DATE) y el resultado hubiera sido idéntico ¿verdad?

Pero mirando el explain plan de uno y otro, vemos alguna diferencia:

Internamente el extract se resuelve con INTERNAL_FUNCTION , mientras que el uso de la nueva función, el acceso es distinto. Curioso, en próximos artículos tendremos que profundizar este punto.

En el próximo artículo, veremos las funciones RETAIL y FISCAL.

Espero que os guste. ¡Nos vemos en el próximo artículo!