[26ai] SQL: Calendar functions/Aggregation Filters "CALENDAR"
![[26ai] SQL: Calendar functions/Aggregation Filters "CALENDAR"](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F587e3328-9877-4c7a-aad7-7811e251f81e.png&w=3840&q=75)
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:
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!
![[OCI] Recreación PDB$SEED](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F289ede5b-558c-4f93-b5c0-fa04680c91ca.png&w=3840&q=75)
![[OCI] Clone PDB](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F8ce0c665-4a5d-459d-91cf-ffe3f47d8176.png&w=3840&q=75)
![[OCI] Check Jobs DBCli](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F1376a869-58fa-491e-926a-a6ead08f9c80.png&w=3840&q=75)
![[26ai] JOIN_TO_ME](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fuploads%2Fcovers%2F65605419d28f19cc44df7ef1%2F16a23f6e-ec4c-4f0a-9529-2c8a2af2ef5e.png&w=3840&q=75)