====== Snippets Oracle SQL ======
===== Pruebas =====
Mostrar las tablas a las que tiene acceso nuestra cuenta:
SELECT owner, table_name
FROM all_tables
Mostrar nuestras tablas:
SELECT table_name
FROM user_tables
===== Fechas =====
==== Modificación ====
Fecha de hace 6 meses:
SELECT sysdate, -- 01/07/25
add_months(sysdate, - 6) -- 01/01/25
FROM dual
==== Operaciones ====
Diferencia entre fechas:
select (sysdate - to_date('2020-01-01 00:00', 'YYYY-MM-DD hh24:mi') as dias_diferencia
from dual
Mostraría los días entre sysdate y las 2020-01-01 00:00. Si queremos pasarlo a horas, habría que multiplicarlo por 24. Para pasar a minutos, multiplicarlo por 24 y por 60, etc.
==== Extracción ====
Para extraer año, mes, día de una fecha:
SELECT EXTRACT(YEAR FROM sysdate)
FROM dual;
SELECT EXTRACT(MONTH FROM sysdate)
FROM dual;
SELECT EXTRACT(DAY FROM sysdate)
FROM dual;
Otra opción:
SELECT to_char(sysdate, 'yyyy')
FROM dual;
SELECT to_char(sysdate, 'mm')
FROM dual;
SELECT to_char(sysdate, 'dd')
FROM dual;
* [[https://livesql.oracle.com/apex/livesql/file/content_GCEY1DN2CN5HZCUQFHVUYQD3G.html|TO_CHAR Day Format Masks]]
==== Agrupar ====
Si queremos agrupar por año y mes:
select to_char(DATE_CREATED, 'YYYY-MM'), sum(Num_of_Pictures)
from pictures_table
group by to_char(DATE_CREATED, 'YYYY-MM')
order by 1
De otra forma, con un SQL estándar:
select extract(year from date_created) as yr, extract(month from date_created) as mon,
sum(Num_of_Pictures)
from pictures_table
group by extract(year from date_created), extract(month from date_created)
order by yr, mon;
==== Filtrar ====
Descartar fines de semana (sábados y domingos)
SELECT *
FROM tabla
WHERE TO_CHAR(campo_fecha, 'DY','NLS_DATE_LANGUAGE=AMERICAN') NOT IN ('SAT', 'SUN')
===== Texto =====
==== Extracción ====
Mediante la función REGEXP_SUBSTR se puede extraer un subcadena de un texto:
select regexp_substr('Metallica - Nothing Else Matters', '[^-[:space:]]*$')
from dual
Devolvería ''Nothing Else Matters''
Como el regex de Oracle está basado en POSIX, no se puede utilizar ''\s'' para coincidencias de espacios en blanco sino que se debe usar ''[:space:]'' o ''[:blank:]'' para espacios y tabulaciones.
==== Filtrando por texto que comienza por ====
SELECT column1, column2, column3
FROM dual
WHERE regexp_like(column1, '^(987|I)')
Filtraríamos por la column1 buscando que comenzase por ''987'' o por ''I''.
===== Otras =====
==== Versión de la base de datos ====
SELECT banner
FROM v$version
WHERE banner LIKE 'Oracle%'
Ejemplo de salida:
Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production
==== Limitar resultados ====
Desde la versión 12c de Oracle:
SELECT *
FROM nombre_de_tabla
FETCH FIRST 10 ROWS ONLY;
En versiones anteriores:
SELECT *
FROM nombre_de_tabla
WHERE ROWNUM <= 10;
===== Recursos =====
* [[https://stackoverflow.com/questions/8919481/how-to-select-only-1-row-from-oracle-sql|Selecciónar solo 1 registro]]
* [[https://learnsql.com/blog/the-most-useful-date-and-time-functions-in-oracle-database|The Most Useful Date and Time Functions]]