Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como trabalhar com funções de data no Oracle sql


Este post estou tentando explicar muitas coisas sobre data no oracle, como funções de data oracle sql, formato de data oracle sql, comparação de data oracle sql, diferença de data oracle em  anos, diferença de data oracle em  dias, diferença de data oracle em  meses

A Oracle fornece tipos de carimbo de data e hora para armazenar as informações de data e hora no banco de dados Oracle.

Tipo de dados de data


DATE é o tipo de dados oracle com o qual todos estamos familiarizados quando pensamos em representar valores de data e hora. Tem a capacidade de armazenar o mês, dia,
ano, século, horas, minutos e segundos. O problema com o tipo de dados DATE é sua granularidade ao tentar determinar um intervalo de tempo entre dois eventos quando os eventos ocorrem dentro de um segundo um do outro. Este problema é resolvido com o tipo de dados TIMESTAMP

Carimbo de data e hora


A Oracle expandiu o tipo de dados DATE e nos deu o tipo de dados TIMESTAMP que armazena todas as informações que o tipo de dados DATE armazena, mas também inclui segundos fracionários. Se você deseja converter um tipo de dados DATE para um formato de tipo de dados TIMESTAMP, você pode usar a função CAST
SQL> SELECT CAST(last_login_date AS TIMESTAMP) "Data" FROM users;Data-------------------- ----------------------20-APR-16 01.55.14.000000 PM21-JUN-16 14.16.36.000000 AM21-JUL-16 10.16.36.000000 AM21-SET- 16 16.11.36.000000 AM21-DEC-16 16.11.36.000000 AM

Para obter a data e a hora do sistema retornadas em um tipo de dados TIMESTAMP, você pode usar a função SYSTIMESTAMP, como:
SQL> SELECT SYSTIMESTAMP FROM DUAL;SYSTIMESTAMP----------------------------------------------------- ------------------------------------01-SET-19 01.02.17.158913 PM -04:00 
Algum ponto importante

1) Ambos os tipos DATE e TIMESTAMP sempre contêm um componente de data e hora. Exatamente meia-noite, a hora é 00:00:00.
SELECT TO_CHAR(SYSDATE, 'MM/DD/AAAA HH:MI:SS AM') date_with_time,TRUNC(SYSDATE) hoje,TO_CHAR(TRUNC(SYSDATE), 'MM/DD/AAAA HH:MI:SS AM' ) date_with_time_midnightFROM dual 2 3 4;DATE_WITH_TIME TODAY DATE_WITH_TIME_MIDNIGHT----------- --------- --------- ------------- 27/10/2016 11:01:00 27-OUT-16 27/10/2016 00:00:00

2) Nunca confie em conversões implícitas de strings para datas ou datas para strings. Sempre execute explicitamente as conversões com as funções TO_CHAR, TO_DATE e TO_TIMESTAMP ou use literais ANSI DATE ou TIMESTAMP.
3) Ao fazer comparações de data ou carimbo de data/hora, sempre considere o impacto do componente de tempo. Se você quiser descontar o componente de tempo da comparação, use o TRUNC ou REDONDO funções para removê-lo de ambos os lados da comparação.
selecione * de fnd_table onde trunc(creation_date)  
4) Você pode exibir o formato de data necessário usando nls_date_format no nível da sessão

Alterar formato de data no oracle usando nls_date_format
ALTER SESSION SET NLS_DATE_FORMAT ='YYYY MM DD';selecione sysdate de dual;ALTER SESSION SET NLS_DATE_FORMAT ='HH24:MI:SS';selecione sysdate de dual;alter session set nls_date_format ='dd-mon-yyyy hh24:mi:ss';selecione sysdate de dual;

5) Aqui está um bom resumo dos formatos de hora que podemos usar
Elemento Descrição
Elementos de formato de data
SCC ou CC Século; S prefixa a data BC com –
AAAA ou SYYYY Ano; S prefixa a data BC com –
AAA ou AA ou A Últimos 3, 2 ou 1 dígito do ano
S,YYY Ano com vírgula nesta posição
IYYY, IYY, IY, I ano de 4, 3, 2 ou 1 dígito com base no padrão ISO
ANO ou ANO Ano escrito; S prefixa a data BC com –
BC ou AD Indicador BC/AD
BC ou AD Indicador BC/AC com períodos
Q Trimestre do ano
MM Mês, valor de dois dígitos
MÊS Nome do mês preenchido com espaços em branco até 9 caracteres
SEG Nome do mês, abreviação de três letras
RM Mês numeral romano
WW ou W Semana do ano ou mês
DDD ou DD ou D Dia do ano, mês ou semana
DIA Nome do dia preenchido com espaços em branco até 9 caracteres
DY Nome do dia; Abreviação de 3 letras
J Dia Juliano; o número de dias desde 31 de dezembro de 4713 aC
Elementos de formato de hora
AM ou PM Indicador de meridiano
A.M. ou PM Indicador de meridiano com períodos
HH ou HH12 ou HH24 Hora do dia ou hora(1-12) ou hora(0-23)
MI Minuto (0-59)
SS Segundo (0-59)
SSSS Segundos depois da meia-noite (0-86399)
Sufixos
TH Número ordinal (ou seja, DDTH para 5º)
SP Número escrito (ou seja, DDSP para CINCO)
SPTH ou THSP Números ordinais soletrados (por exemplo, DDSPTH para FIFTH)
Outros elementos de formatação
/ , . A pontuação é reproduzida no resultado
“do” A string entre aspas é reproduzida no resultado

funções de data do oráculo


Aprendemos sobre os tipos de dados Date e Timestamp na seção anterior. Veremos agora em detalhes importantes funções de data do oráculo e como podemos usá-las

ADD_MONTHS  

Função de data Descrição
ADD_MONTHS (data, n) Retorna um valor de data após adicionar 'n' meses à data 'x'.
selecione ADD_MONTHS ('16-Sep-81', 3)      de dual----------------------------16-Dez- 81

ADD_MONTHS sempre muda a data por meses inteiros. Você pode fornecer um valor fracionário para o parâmetro month_shift, mas ADD_MONTHS sempre arredondará para baixo para o número inteiro mais próximo de zero, conforme mostrado nestes
exemplos:

então
selecione ADD_MONTHS ('28-FEB-2005', 1.5)              de dual-------------------------------- -----------31-Mar-2005

Podemos usar valores negativos também
selecione ADD_MONTHS ('28-FEB-2005', -1)                de dual--------------------------31 -Janeiro de 2005

Último_dia

Função de data Descrição
LAST_DAY (x) É usado para determinar o número de dias restantes em um mês a partir da data 'x' especificada.

A função LAST_DAY retorna a data do último dia do mês para uma determinada data. Esta função é útil porque o número de dias em um mês varia ao longo do ano.
selecione LAST_DAY ('01-Jun-16')     de dual---------------------------------- ------------------30-Jun-2016

Próximo_dia

Função de data Descrição
NEXT_DAY (x, week_day) Retorna a próxima data do 'week_day' em ou após a data 'x' ocorrer.

NEXT_DAY retorna a data do primeiro dia da semana nomeado por dia posterior à data. O tipo de retorno é sempre DATE, independentemente do tipo de dados de data. O dia do argumento deve ser um dia da semana no idioma da data da sua sessão, seja o nome completo ou a abreviatura
selecione NEXT_DAY ('01-Jun-08', 'Wednesday')       de dual------------------------------ -------------04-JUN-08

MONTHS_BETWEEN 

Função de data Descrição
MONTHS_BETWEEN (x1, x2) Retorna o número de meses entre as datas x1 e x2.

A função MONTHS_BETWEEN calcula o número de meses entre duas datas e retorna essa diferença como um número

As regras para o cálculo são

1) Se date1 vier após date2, MONTHS_BETWEEN retornará um número positivo.
2) Se date1 vier antes de date2, MONTHS_BETWEEN retornará um número negativo.
3) Se date1 e date2 caírem no último dia de seus respectivos meses, MONTHS_BETWEEN retornará um número inteiro (sem componente fracionário).
4)Se data1 e data2 estiverem em meses diferentes e pelo menos uma das datas não for o último dia do mês, MONTHS_BETWEEN retornará um número fracionário. O componente fracionário é calculado com base em 31 dias e também considera quaisquer diferenças no componente de tempo de data1 e data2.

Exemplos
selecione MONTHS_BETWEEN ('29-FEB-2016', '31-MAR-20')    de dual-------------------------- -------------------------------------------------- -----1selecione  MONTHS_BETWEEN ('31-MAR-1995', '28-FEB-1994') de dual-------------------- -------------------------------------------------- -----13selecione  MONTHS_BETWEEN ('31-JAN-2006', '10-MAR-2006') de dual------------------------ -------------------------------------------------- ---1.3225806SELECT MONTHS_BETWEEN(TO_DATE('02-02-1995','MM-DD-AAAA'),TO_DATE('01-01-1995','MM-DD-AAAA') ) "Meses"FROM DUAL;Meses----------1.03225806

Um ponto importante a ser lembrado

MONTHS_BETWEEN calcula o componente fracionário do número de meses assumindo que
cada mês tem 31 dias. Portanto, cada dia adicional em um mês completo conta 31/1 de um mês e:
1 dividido por 31 =0,032258065

Rodada 

Função de data Descrição
ARREDO (x, formato_data) Retorna a data 'x' arredondada para o século, ano, mês, data, hora, minuto ou segundo mais próximo, conforme especificado pelo 'date_format'.

A função ROUND arredonda um valor de data para a data mais próxima, conforme especificado por uma máscara de formato. É como a função numérica ROUND padrão, que arredonda um número para o número mais próximo da precisão especificada, exceto que funciona com datas

Exemplos
Selecione ROUND (TO_DATE ('12-MAR-2016'), 'MONTH') do dual;01-MAR-2016Selecione ROUND (TO_DATE ('17-MAR-2016'), 'MONTH') do dual;01 -APR-2016selecione ROUND (TO_DATE ('01-MAR-2007'), 'YYYY') de dual;01-JAN-2007select ROUND (TO_DATE ('01-SEP-2007'), 'YEAR') de dual;01 -JAN-2008

Truncar

Função de data Descrição
TRUNC (x, formato_data) Retorna a data 'x' menor ou igual ao século, ano, mês, data, hora, minuto ou segundo mais próximo, conforme especificado pelo 'date_format'.

Exemplos
Selecione TRUNC (TO_DATE ('12-MAR-2016'), 'MONTH') do dual;01-MAR-2016 Selecione TRUNC (TO_DATE ('17-MAR-2016'), 'MONTH') do dual; 01-MAR-2016 selecione TRUNC (TO_DATE ('01-MAR-2007'), 'YYYY') do dual;01-JAN-2007select TRUNC (TO_DATE ('01-SEP-2007'), 'YEAR') do dual;01-JAN-2007

Aritmética com data Oracle


Podemos realizar muitas operações aritméticas no tipo de dados oracle date. Podemos adicionar ou subtrair um número de ou para uma data para um valor de data resultante. podemos subtrair duas datas para encontrar o número de dias entre essas datas. adicionamos horas à data dividindo o número de horas por 24.

Exemplos de adição e subtração
SQL> selecione 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

Outras maneiras de usá-lo são
Descrição Expressão de data
Agora Sistema
Amanhã/dia seguinte Sistema +1
Sete dias  atrás SYSDATE -7
Daqui uma hora SYSDATE + 1/24
Daqui a três horas SYSDATE + 24/3  ou SYSDATE + 1/8
Daqui a meia hora SYSDATE + 1/48
10 minutos a partir de agora SYSDATE + 10/1440
Daqui a 30 segundos SYSDATE + 30/86400

Operação aritmética na diferença de datas para encontrar o número de dias entre elas

Podemos subtrair duas datas para encontrar  a diferença de dias entre as datas
Se a parte do tempo for a mesma, será sempre um número inteiroSELECT 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----------6Se a parte do tempo não for a mesma, então ele sempre terá componentes fracionáriosSELECT TO_DATE('25-MAR-2016 10:00:00 AM', 'YYYYMMDD HH:MI:SS AM')- TO_DATE('19-MAR-2016 11:00:00 AM', 'AAAAMMDD 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', 'YYYYMMDD HH:MI:SS AM') diff_in_daysFROM   dual;DIFF_IN_DAYS----------6.04166666

Podemos encontrar a diferença de data do oráculo em  meses usando a consulta
SELECT MONTHS_BETWEEN(TO_DATE('02-02-1995','MM-DD-AAAA'),TO_DATE('01-01-1995','MM-DD-AAAA') ) "Diff_in_Months", (TO_DATE ('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

Também podemos encontrar a diferença de data do oráculo em  anos usando a consulta
SELECT (TO_DATE('20130525', 'AAAAMMDD') - TO_DATE('20100101', 'AAAAMMDD')) diff_in_days , MONTHS_BETWEEN(TO_DATE('20130525', 'AAAAMMDD'), TO_DATE('20100101', 'AAAAMMD' ')) Diff_in_months,TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'YYYYMMDD'), TO_DATE('20100101', 'YYYYMMDD'))) Diff_in_months_DDno_fraction,TRUNC(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525')) , TO_DATE('20100101', 'AAAAMMDD')))) / 12) Diff_in_years_no_fraction,MOD(TRUNC(MONTHS_BETWEEN(TO_DATE('20130525', 'AAAAMMDD'), TO_DATE('20100101', 'AAAAMMDD'))), 12) Diff_in_years_fraction_in_monthsfrom dual; diff_in_days diff_in_months diff_in_months_no_fraction diff_in_year_no_fract 

Espero que gostem do post sobre datatype oracle. Tentei explicar várias coisas, como funções de data oracle, formato de data oracle sql, comparação de data oracle sql, diferença de data oracle em anos, diferença de data oracle em dias, diferença de data oracle em meses. Não é um guia completo, mas tentei apresentar muitas informações úteis para o desenvolvedor oracle sql

Artigos relacionados

como escrever consultas sql
Tutorial do Oracle sql:Instrução básica do SQL
Tutorial do Oracle sql:Restringindo o conjunto de dados
Funções de linha única no sql
Processamento de decodificação do Oracle sql
Baixar Desenvolvedor Oracle SQL
https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm#OLADM780