Fala, galera. Tudo bem?
Continuando com o assunto de funções simples(Single Row Functions), resolvi quebrar o artigo em dois, pra deixar as funções de datas separadas, funções essas que são extremamente utilizadas por nós que trabalhamos com Oracle.
Função SYSDATE
Função pra retornar a data e hora atual do servidor.
SELECT SYSDATE FROM dual;
Função CURRENT_DATE
Mais uma função pra retornar data, a diferença do current_date p/ o sysdate é que a função current_date retorna a data e hora de acordo com o fuso horário da sessão do usuário.
SELECT current_date FROM dual;
Somando dias em datas.
Toda data quando adicionamos ou subtraimos um número, c/ isso alteramos a data em quantidade de dias, exemplo:
SELECT SYSDATE
,SYSDATE + 5
,SYSDATE -30
FROM dual;
Podemos também subtrair (data - data)
Obs: Menos de 100 dias p/ o natal...rs
SELECT SYSDATE, (TRUNC(SYSDATE) - TO_DATE('25/12/2020')) FROM DUAL;
Outra coisa legal que da pra fazer com as funções de datas é, suponhamos que você precise saber quantas semanas um determinado funcionário está trabalhando na sua empresa, utilizando a data de contratação, conseguimos calcular a quantidade de semanas:
Dt_Contratacao = 04/12/2017
Conta = Data atual - Dt_Contratacao/ 7 (Quantidade de dias que tem uma semana)
145 semanas é o resultado.
SELECT (TRUNC(SYSDATE) - to_date('04/12/2017','dd/mm/rrrr') )/7 FROM DUAL;
Agora mais algumas coisas que da pra fazer com as datas/ horas.
Caso seja necessário somar uma quantidade de minutos, ou menos segundos a uma data, basta fazer as contas e aplicar, exemplos.
Adicionando 5 minutos a uma data/ hora, basta colocarmos 5/1440 que é a quantidade de minutos que temos em um dia (1440/60) = 24.
SELECT TO_CHAR(SYSDATE,'DD/MM/YYYY HH24:MI:SS') Hora_Atual,
TO_CHAR(SYSDATE + 5/1440, 'DD/MM/YYYY HH24:MI:SS') "Hora+5min"
FROM DUAL;
Função ADD_MONTHS, muito utilizada, adiciona ou subtrai meses a uma data desejada.
SELECT TRUNC(SYSDATE) dt_atual
,add_months(TRUNC(SYSDATE),2) "+2 Meses"
,add_months(TRUNC(SYSDATE),-2) "-2 Meses"
FROM DUAL;
Função MONTHS_BETWEEN, traz a quantidade de meses entre uma data e outra.
SELECT TRUNC(SYSDATE) dt_atual
,months_between(to_Date('17/01/2021','dd/mm/rrrr'), TRUNC(SYSDATE)) meses
FROM DUAL;
Função NEXT_DAY, traz pra você o próximo dia da semana, conforme parâmetro especificado.
SELECT NEXT_DAY(SYSDATE,'SEGUNDA') "NEXT DAY"
FROM DUAL;
Obs: a função acima só respeita o português, devido as variáveis de ambiente do banco ao qual eu estou trabalhando estarem configuradas p/ o português, caso contrario, parâmetros deverão ser informados em inglês.
Função Last_Day, retorna o ultimo dia do mês.
SELECT LAST_DAY(SYSDATE) FROM DUAL;
Outros exemplos, o round arredondou a data p/ cima, e o trunc p/ baixo.
SELECT ROUND(SYSDATE, 'MONTH')
,TRUNC(SYSDATE, 'MONTH')
FROM DUAL;
Ultimo ponto, a nível de curiosidade.
Trabalhando com as mascaras YYYY x RRRR
Quando temos a data armazenada com o ano com 4 dígitos não há diferença entre as mascaras.
Você só vai notar diferença entre essas mascaras, caso esteja utilizando datas com formação de ano com 2 dígitos, exemplos abaixo:
SELECT to_date('01-jan-77','dd/mm/rrrr') FROM dual
Agora utilizando a mesma data, porém com a mascara YYYY
SELECT to_date('01-jan-77','dd/mm/yyyy') FROM dual
Por que isso ocorre?
Se a data tem apenas dois dígitos e utilizamos a formatação YYYY, o banco sempre vai assumir os dois dígitos iniciais 00, conforme exemplo abaixo.
SELECT to_date('01-jan-01','dd/mm/yyyy') dt1
,to_date('01-jan-49','dd/mm/yyyy') dt2
,to_date('01-jan-50','dd/mm/yyyy') dt3
,to_date('01-jan-99','dd/mm/yyyy') dt4
FROM dual
Utilizando o RRRR, o banco aplica a seguinte regra, se o ano estiver entre 00 e 49 assume o século atual, se estiver entre 50 e 99, assume o século anterior;
SELECT to_date('01-jan-01','dd/mm/rrrr') dt1
,to_date('01-jan-49','dd/mm/rrrr') dt2
,to_date('01-jan-50','dd/mm/rrrr') dt3
,to_date('01-jan-99','dd/mm/rrrr') dt4
FROM dual
Bom, espero que tenham gostado.
Um abraço.
Leonardo Silva.
Nenhum comentário:
Postar um comentário