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