quinta-feira, 17 de setembro de 2020

Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Utilizando funções simples(Single Row Functions) Cont.

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

Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Comando Merge

Fala, galera. Tudo bem? Hoje vou falar um pouco sobre o comando MERGE. O MERGE é um comando DML que combina as funções de insert, update e d...