sql >> Base de Datos >  >> RDS >> Oracle

Cómo trabajar con funciones de fecha en Oracle sql

En esta publicación, intento explicar muchas cosas sobre la fecha en Oracle, como las funciones de fecha de Oracle SQL, el formato de fecha de Oracle SQL, la comparación de fechas de Oracle SQL, la diferencia de fechas de Oracle en años, la diferencia de fechas de Oracle en días, la diferencia de fechas de Oracle en meses

Oracle ha proporcionado tipos de marca de fecha y hora para almacenar la información de fecha y hora en la base de datos de Oracle.

Tipo de datos de fecha

DATE es el tipo de datos de Oracle con el que todos estamos familiarizados cuando pensamos en representar valores de fecha y hora. Tiene la capacidad de almacenar el mes, día,
año, siglo, horas, minutos y segundos. El problema con el tipo de datos DATE es su granularidad cuando se trata de determinar un intervalo de tiempo entre dos eventos cuando los eventos ocurren con un segundo de diferencia entre sí. Este problema se resuelve con el tipo de datos TIMESTAMP

Marca de tiempo

Oracle ha ampliado el tipo de datos DATE y nos ha proporcionado el tipo de datos TIMESTAMP que almacena toda la información que almacena el tipo de datos DATE, pero también incluye fracciones de segundo. Si desea convertir un tipo de datos DATE a un formato de tipo de datos TIMESTAMP, puede usar la función CAST

SQL> SELECT CAST(last_login_date AS TIMESTAMP) "Date" FROM users;Date------------------------------- ----------------------20-ABR-16 01.55.14.000000 PM21-JUN-16 14.16.36.000000 AM21-JUL-16 10.16.36.000000 AM21-SEP- 16 11.16.36.000000 AM21-DEC-16 11.16.36.000000 AM

Para obtener la fecha y la hora del sistema en un tipo de datos TIMESTAMP, puede usar la función SYSTIMESTAMP como:

SQL> SELECCIONE SYSTIMESTAMP DE DUAL;SYSTIMESTAMP--------------------------------------- ------------------------------------01-SEP-19 01.02.17.158913 PM -04:00

Algún punto importante

1) Los tipos DATE y TIMESTAMP siempre contienen un componente de fecha y hora. Exactamente a medianoche son las 00:00:00.

SELECT TO_CHAR(SYSDATE, 'MM/DD/AAAA HH:MI:SS AM') fecha_con_hora,TRUNC(SYSDATE) hoy,TO_CHAR(TRUNC(SYSDATE), 'MM/DD/AAAA HH:MI:SS AM' ) fecha_con_hora_medianocheDESDE dual 2 3 4;FECHA_CON_HORA HOY FECHA_CON_HORA_MEDIANOCHE---------------------------- --------- --------- -------------27/10/2016 11:01:00 27-OCT-16 27/10/2016 12:00:00

2) Nunca confíe en conversiones implícitas de cadenas a fechas o fechas a cadenas. Realice siempre explícitamente las conversiones con las funciones TO_CHAR, TO_DATE y TO_TIMESTAMP, o use los literales ANSI DATE o TIMESTAMP.
3) Al realizar comparaciones de fecha o marca de tiempo, siempre tenga en cuenta el impacto del componente de tiempo. Si desea descontar el componente de tiempo de la comparación, use el TRUNC o REDONDO funciones para eliminarlo de ambos lados de la comparación.

seleccione * de fnd_table donde trunc(creation_date)  

4) Puede mostrar el formato de fecha requerido usando nls_date_format en el nivel de sesión

Cambiar formato de fecha en Oracle usando nls_date_format

ALTER SESSION SET NLS_DATE_FORMAT ='YYYY MM DD';seleccione sysdate de dual;ALTER SESSION SET NLS_DATE_FORMAT ='HH24:MI:SS';seleccione sysdate de dual;alter session set nls_date_format ='dd-mon-yyyy hh24:mi:ss';seleccione sysdate de dual;

5) Aquí hay un buen resumen de los formatos de tiempo que podemos usar

Elemento Descripción
Elementos de formato de fecha
SCC o CC Siglo; S prefija la fecha antes de Cristo con –
AAAA o AAAA Año; S prefija la fecha antes de Cristo con –
YYY o YY o Y Últimos 3, 2 o 1 dígito del año
Y,YYY Año con una coma en esta posición
IYYY, IYY, IY, I año de 4, 3, 2 o 1  dígitos según la norma ISO
AÑO o AÑO Año escrito; S prefija la fecha antes de Cristo con –
AC o AD Indicador BC/AD
A.C. o A.D. Indicador BC/AC con puntos
Q Trimestre del año
MM Mes, valor de dos dígitos
MES Nombre del mes rellenado con espacios en blanco hasta una longitud de 9 caracteres
LUN Nombre del mes, abreviatura de tres letras
RM Mes en números romanos
WW o W Semana del año o mes
DDD o DD o D Día del año, mes o semana
DÍA Nombre del día rellenado con espacios en blanco hasta una longitud de 9 caracteres
DY Nombre del día; abreviatura de 3 letras
J día juliano; el número de días desde el 31 de diciembre de 4713 a. C.
Elementos de formato de tiempo
AM o PM Indicador de meridiano
A.M. o PM Indicador de meridianos con puntos
HH o HH12 o HH24 Hora del día u hora(1-12) u hora(0-23)
MI Minuto (0-59)
SS Segundo (0-59)
SSSSS Segundos después de la medianoche (0-86399)
Sufijos
TH Número ordinal (es decir, DDTH para 5TH)
SP Número deletreado (es decir, DDSP para CINCO)
SPTH o THSP Números ordinales deletreados (es decir, DDSPTH para FIFTH)
Otros elementos de formato
/ , . La puntuación se reproduce en el resultado
“del” La cadena citada se reproduce en el resultado

funciones de fecha de Oracle

Aprendimos sobre el tipo de datos Fecha y Marca de tiempo en la sección anterior. Veremos ahora importantes funciones de fecha de Oracle en detalle y cómo podemos usarlas

AÑADIR_MESES

Función de fecha Descripción
ADD_MONTHS (fecha, n) Devuelve un valor de fecha después de agregar 'n' meses a la fecha 'x'.
seleccione ADD_MONTHS ('16-Sep-81', 3)      de dual-----------------------------16-dic- 81

ADD_MONTHS siempre cambia la fecha por meses completos. Puede proporcionar un valor fraccionario para el parámetro month_shift, pero ADD_MONTHS siempre se redondeará hacia abajo al número entero más cercano a cero, como se muestra en estos
ejemplos:

Entonces

seleccione ADD_MONTHS ('28-FEB-2005', 1.5)              de dual-------------------------------- -----------31 de marzo de 2005

También podemos usar valores negativos

seleccione ADD_MESES ('28-FEB-2005', -1)                de dual------------------------------31 -Ene-2005

Último_día

Función de fecha Descripción
ÚLTIMO_DÍA (x) Se utiliza para determinar el número de días que quedan en un mes a partir de la fecha 'x' especificada.

La función LAST_DAY devuelve la fecha del último día del mes para una fecha dada. Esta función es útil porque la cantidad de días en un mes varía a lo largo del año.

seleccione LAST_DAY ('01-jun-16')     de dual---------------------------------- ------------------30-jun-2016

Al día siguiente

Función de fecha Descripción
NEXT_DAY (x, día_semana) Devuelve la siguiente fecha del 'día_de la semana' en o después de la fecha en que ocurre 'x'.

NEXT_DAY devuelve la fecha del primer día de la semana nombrado por el día que es posterior a la fecha. El tipo de devolución siempre es FECHA, independientemente del tipo de datos de fecha. El día del argumento debe ser un día de la semana en el idioma de la fecha de su sesión, ya sea el nombre completo o la abreviatura

seleccione NEXT_DAY ('01-Jun-08', 'Miércoles')       de dual------------------------------ -------------04-JUN-08

MESES_ENTRE

Función de fecha Descripción
MESES_ENTRE (x1, x2) Devuelve el número de meses entre las fechas x1 y x2.

La función MONTHS_BETWEEN calcula el número de meses entre dos fechas y devuelve esa diferencia como un número

Las reglas para el cálculo son

1) Si date1 viene después de date2, MONTHS_BETWEEN devuelve un número positivo.
2) Si date1 viene antes de date2, entonces MONTHS_BETWEEN devuelve un número negativo.
3) Si date1 y date2 caen en el último día de sus respectivos meses, MONTHS_BETWEEN devuelve un número entero (sin componente fraccionario).
4) Si date1 y date2 están en meses diferentes y al menos una de las fechas no es el último día del mes, MONTHS_BETWEEN devuelve un numero fraccional. El componente fraccionario se calcula sobre una base de 31 días y también considera cualquier diferencia en el componente de tiempo de fecha1 y fecha2.

Ejemplos

seleccione MONTHS_BETWEEN ('29-FEB-2016', '31-MAR-20')    de dual-------------------------- -------------------------------------------------- -----1seleccione MONTHS_BETWEEN ('31-MAR-1995', '28-FEB-1994') de dual----------------------- -------------------------------------------------- -----13seleccione MONTHS_BETWEEN ('31-ENE-2006', '10-MAR-2006') de dual----------------------- -------------------------------------------------- ---1.3225806SELECCIONE MESES_ENTRE(HASTA FECHA('02-02-1995','MM-DD-AAAA'),HASTA_FECHA('01-01-1995','MM-DD-AAAA') ) "Meses"DE DUAL;Meses----------1.03225806

Un punto importante para recordar

MONTHS_BETWEEN calcula el componente fraccionario del número de meses suponiendo que
cada mes tiene 31 días. Por lo tanto, cada día adicional durante un mes completo cuenta como 1/31 de un mes y:
1 dividido por 31 =0,032258065

Redondo 

Función de fecha Descripción
REDONDO (x, formato_fecha) Devuelve la fecha 'x' redondeada al siglo, año, mes, fecha, hora, minuto o segundo más cercano según lo especificado por el 'formato_fecha'.

La función ROUND redondea un valor de fecha a la fecha más cercana según lo especificado por una máscara de formato. Es como la función ROUND numérica estándar, que redondea un número al número más cercano de precisión especificada, excepto que funciona con fechas

Ejemplos

Seleccione RONDA (HASTA_FECHA ('12-MAR-2016'), 'MES') de dual;01-MAR-2016Seleccione RONDA (HASTA_FECHA ('17-MAR-2016'), 'MES') de dual;01 -ABR-2016seleccione RONDA (HASTA_FECHA ('01-MAR-2007'), 'YYYY') de dual;01-ENE-2007seleccione RONDA (TO_DATE ('01-SEP-2007'), 'AÑO') de dual;01 -ENE-2008

Tronco

Función de fecha Descripción
TRUNC (x, formato de fecha) Devuelve la fecha 'x' menor o igual al siglo, año, mes, fecha, hora, minuto o segundo más cercano, según lo especificado por el 'formato_fecha'.

Ejemplos

Seleccione TRUNC (TO_DATE ('12-MAR-2016'), 'MES') de dual;01-MAR-2016 Seleccione TRUNC (TO_DATE ('17-MAR-2016'), 'MES') de dual; 01-MAR-2016 seleccione TRUNC (TO_DATE ('01-MAR-2007'), 'YYYY') de dual; 01-ENE-2007seleccione TRUNC (TO_DATE ('01-SEP-2007'), 'YEAR') de dual;01-ENE-2007

Aritmética con fecha de Oracle

Podemos realizar muchas operaciones aritméticas en el tipo de datos de fecha de Oracle. Podemos sumar o restar un número ao desde una fecha para obtener un valor de fecha resultante. podemos restar dos fechas para encontrar el número de días entre esas fechas. Sumamos horas hasta la fecha dividiendo el número de horas entre 24.

Ejemplos de sumas y restas

SQL> seleccione sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 de dual;SYSDATE              SYSDATE+1/24         SYSDATE+1/1440       SYSDATE+1/86400------ -------------- -------------------- ---------------- ---- --------------------01-jul-2016 06:32:12 01-jul-2016 07:32:12 01-jul-2016 06 :33:12 01-jul-2016 06:32:13

Otras formas en que podemos usarlo son

Descripción Expresión de fecha
Ahora Fecha del sistema
Mañana/al día siguiente Sysdate +1
Hace siete días SYSDATE -7
Dentro de una hora SYSDATE + 24/1
Tres horas a partir de ahora SYSDATE + 24/3 o SYSDATE + 1/8
Dentro de media hora SYSDATE + 1/48
Dentro de 10 minutos SYSDATE + 10/1440
Dentro de 30 segundos SYSDATE + 30/86400

Operación aritmética en  diferencia de fecha para encontrar el número de días entre ellos

Podemos restar dos fechas para encontrar  la diferencia de días entre  las fechas

Si la parte horaria es la misma, siempre será un número enteroSELECT TO_DATE('25-MAR-2016 11:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM')- TO_DATE(' 19-MAR-2016 11:00:00 AM', 'DD-MON-YYYY HH:MI:SS AM') diff_in_daysFROM   dual;DIFF_IN_DAYS----------6Si la parte horaria no es la misma, entonces siempre tendrá componentes fraccionarios. 'YYYYMMDD HH:MI:SS AM') diff_in_daysFROM     dual;DIFF_IN_DAYS----------5.95833333SQL> SELECT  TO_DATE('25-MAR-2016 11:00:00 AM', 'YYYYMMDD HH:MI:SS AM')- TO_DATE('19-MAR-2016 10:00:00 AM', 'AAAAMMDD HH:MI:SS AM') diff_in_daysFROM   dual;DIFF_IN_DAYS----------6.04166666

Podemos encontrar la diferencia de fechas de Oracle en  Meses usando la consulta

SELECCIONE MESES_ENTRE(HASTA_FECHA('02-02-1995','MM-DD-AAAA'),HASTA_FECHA('01-01-1995','MM-DD-AAAA') ) "Diferencia_en_meses", (HASTA_FECHA ('02-02-1995','MM-DD-AAAA')-TO_DATE('01-01-1995','MM-DD-AAAA')  diff_in_daysFROM DUAL;Diff_in_Months      diff_in_days--------- -------------------------------1.03225806              32

También podemos encontrar la diferencia de fechas de Oracle en  años usando la consulta

SELECT (TO_DATE('20130525', 'YYYYMMDD') - TO_DATE('20100101', 'YYYYMMDD')) diff_in_days , MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD ')) Dif_en_meses,TRUNC(MESES_ENTRE(TO_DATE('20130525', 'AAAAMMDD'), TO_DATE('20100101', 'AAAAMMDD'))) Diff_en_meses_sin_fracción,TRUNC(TRUNC(MESES_ENTRE(TO_DATE('20130525', 'AAAAMMDD') , TO_DATE('20100101', 'YYYYMMDD'))) / 12) Diff_in_years_no_fraction,MOD(TRUNC(MESES_ENTRE(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))), 12) DIFF_IN_YEARS_FRACTION_IN_MONTHSFROM dual; diff_in_days diff_in_months diff_in_months_no_fraction diff_in_year_no_fraction diff_in_years_fraction_in_months________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ibil elécente 


Espero que le guste la publicación sobre el tipo de datos de fecha de Oracle. Intenté explicar varias cosas, como las funciones de fecha de Oracle, el formato de fecha de Oracle SQL, la comparación de fechas de Oracle SQL, la diferencia de fechas de Oracle en años, la diferencia de fechas de Oracle en días, la diferencia de fechas de Oracle en meses. No es una guía completa pero he tratado de presentar mucha información útil para el desarrollador de Oracle sql

Artículos relacionados

cómo escribir consultas sql
Tutorial de Oracle sql:Declaración básica de Sql
Tutorial de Oracle sql:Restricción del conjunto de datos
Funciones de fila única en sql
Procesamiento de decodificación de Oracle sql
Descargar Desarrollador de Oracle SQL
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780