top of page
Foto do escritorGabriel Quintella

Comandos DML - Parte 5 - SELECT - Funções de Conversão e Manipulação de Datas


Salve, salve meus amigos! Vamos para mais um dia de treinamento. Nesse momento da pandemia espero que todos estejam bem e cuidando-se, pois não podemos dar mole para o Corona!


No post de hoje vamos abordar dois comandos muito utilizados para conversão de dados e manipulação de dados do tipo data. Hoje o post é mais simples, porém rico em dicas! Mãos à obra.


Funções Cast() e Convert()


As funções Cast() e Convert() são usadas apenas para conversão de dados. Ótimo, agora qual a diferença? A função Cast() é uma função do padrão ANSI já a Convert() é uma função do engine do Microsoft SQL Server (T-SQL).


Vamos analisar agora a sintaxe.


CAST (expression AS data_type [ (length ) ] )

CONVERT (data_type [ (length ) ] ,expression [ ,style ] )

Onde:


Expression: É o campo a qual quer se aplicar o CAST() ou o CONVERT();

Data_Type: É o tipo de dado, exemplo: VARCHAR, INT, MONEY, etc;

Length: É o parâmetro opcional de tipos de dados nchar, nvarchar, char, varchar, binary ou varbinary.


Momento Dica!


No CONVERT(), se o comprimento não for especificado, o padrão será 30 caracteres;


Style, é o formato da data que deseja na conversão (Esse assunto será abordado nesse tópico só mais à frente).


Comentaremos agora sobre duas formas de conversão existentes no Microsoft SQL Server. A conversão implícita e a explicita.


Quando nos referimos a conversão implícita, o engine do Microsoft SQL Server realiza a conversão de forma automática, ou seja, sem precisar especificar a função Cast() ou Convert(). Analise o exemplo a seguir. Definimos duas variáveis (@Num1 e @Num2) com datatypes diferentes, associamos valores e realizamos a operação de soma.


-- # Exemplo conversão implícita
DECLARE @Num1 AS INT= 20000,
        @Num2 AS TINYINT = 9

SELECT @Num1+@Num2

Já na conversão explicita existe a necessidade de especificar a função Cast() ou Convert(). No exemplo abaixo, vamos fazer um SELECT na função GETDATE() para retornar a data do servidor. Observe que o valor retornado será assim AAAA-MM-DD HH:MM:SS. Com a função CONVERT, possuímos a opção de escolher um estilo, ou seja, a forma como iremos o dado será DD/MM/AAAA, para isso usaremos o style 103.


-- # Converter o GETDATE() para o formado DD/MM/AAAA
SELECT CONVERT(VARCHAR(10),GETDATE(),103) Data 

Existe uma tabela de conversão que pode ser utilizada para decidir se deve ou não utilizar alguma função de conversão para cada caso:



Seguindo as informações da tabela, caso seja necessário realizar uma conversão de varchar para date podemos fazer implicitamente:


-- # Converter VARCHAR() para DATE
DECLARE @data DATE = '2017-06-21';

No entanto, para converter um datetime para timestamp existe a necessidade de fazer explicitamente:


-- # Converter GETDATE() para TIMESTAMP()
DECLARE @data DATETIME = GETDATE();
DECLARE @hora TIMESTAMP = CAST(@data AS TIMESTAMP);

Quanto a performance, não existe uma regra. Para cada tipo há uma variação mínima entre os dois usos.







Ao tratarmos a função CONVERT() para manipulação de dados do tipo data. Existem styles que auxiliam no retorno das informações em diversas formas variadas. Confesso que não gravo todos e sempre que preciso recorro ao site www.w3schools.com, super recomendo para vocês.


Utilizo muito essa tabela, tenham ela sempre a mão!




Link referencia:





Manipulação de Datas


Nesse tópico vamos abordar as funções que existem e que ajudam a manipular informações de data.


Vamos responder de forma rápida essa pergunta simples, qual o número de dias vividos por você até hoje? Difícil responder de bate e pronto, mas o Microsoft SQL Server para nos ajuda, vejamos a seguir!


Vamos dar uma palinha para responder a pergunta acima. A expressão SQL que retorna o número de dias vivido por você até hoje é:


DECLARE @DATANASCIMENTO VARCHAR(10) 
SET @DATANASCIMENTO = '' -- INFORME SUA DATA DE NASCIMENTO NO FORMATO AAAA-MM-DD
SELECT DATEDIFF(DAY, @DATANASCIMENTO, GETDATE())

As principais funções que abordaremos são: GETDATE, DATEPART, DATEADD, DATEDIFF, YEAR, MONTH e DAY.




Link de Funções de Manipulação de Data: https://docs.microsoft.com/pt-br/sql/t-sql/functions/date-and-time-data-types-and-functions-transact-sql?view=sql-server-ver15





GETDATE()


A função GETDATE(), mais famosa e uma das mais usadas, tem por finalidade retornar a data e a hora atuais do sistema. Sintaxe bem simples, observe a seguir.


SELECT GETDATE()

DATEPART(unidade, data)


A função DATEPART() faz o fatiamento da data, e retorna uma parte especifica da data como um valor inteiro da unidade (YEAR, MONTH ou DAY) definida. Observe os exemplos:


-- # Retorno do Ano
SELECT DATEPART(YEAR,'1981-11-14')
Reposta: 1981

-- # Retorno do Mês
SELECT DATEPART(MONTH,'1981-11-14')
Reposta: 11

-- # Retorno do Dia
SELECT DATEPART(DAY,'1981-11-14')
Reposta: 14

Existe outra forma para retornar os valores de ano, mês e dia, observem o exemplo.


-- # Retorno do Ano
SELECT YEAR('1981-11-14')
Reposta: 1981

-- # Retorno do Mês
SELECT MONTH('1981-11-14')
Reposta: 11

-- # Retorno do Dia
SELECT DAY('1981-11-14')
Reposta: 14

DATEADD(unidade, incremento, data)


A função DATEADD() retorna uma nova data através do valor de incremento de unidades especificadas pelo valor unidade (YEAR, MONTH ou DAY) a uma data. Observe os exemplos:


-- # Adicionado 6 DIAS na Data
SELECT DATEADD(DAY,6,'1981-11-14')
Reposta: 1981-11-20

-- # Adicionado 6 MESES na Data
SELECT DATEADD(MONTH,6,'1981-11-14')
Reposta: 1982-05-14

-- # Adicionado 6 ANOS na Data
SELECT DATEADD(YEAR,6,'1981-11-14')
Reposta: 1987-11-14

DATEDIFF (unidade, data_inicial, data_final)


A função DATEDIFF é usada para calcular a diferença entre duas datas, data_final e data_inicial. Retornando o resultado como um inteiro, cuja unidade é definida pelo valor unidade (YEAR, MONTH ou DAY). Observe os exemplos:


-- # Subtração Entre Dados retornando em DIAS
SELECT DATEDIFF(DAY ,'1981-11-14',GETDATE())
Reposta: 14406 (dias)

-- # Subtração Entre Dados retornando em MESES
SELECT DATEDIFF(MONTH,'1981-11-14',GETDATE())
Reposta: 473 (meses)

-- # Subtração Entre Dados retornando em ANO
SELECT DATEDIFF(YEAR,'1981-11-14',GETDATE())
Reposta: 40 (anos)

Agora que falamos das funções, vamos criar um exemplo incrementado.


Exemplo: Criar uma consulta para exibir, para cada cliente, a idade em dias, meses e em anos (idade do cliente na data atual e em 31 de dezembro).



SELECT NOME, NASCIMENTO,
DATEDIFF(DAY,NASCIMENTO,GETDATE())AS DIASVIVIDOS,
DATEDIFF(MONTH,NASCIMENTO,GETDATE()) AS MESESVIVIDOS,
CASE WHEN 
     DATEPART(MONTH,NASCIMENTO) <= DATEPART(MONTH,GETDATE()) AND 
     DATEPART(DAY,NASCIMENTO)<= DATEPART(DAY,GETDATE()) 
     THEN (DATEDIFF(YEAR,NASCIMENTO,GETDATE())) 
     ELSE (DATEDIFF(YEAR,NASCIMENTO,GETDATE()))- 1 END AS IDADEATUAL,
DATEDIFF(YEAR,NASCIMENTO,GETDATE()) AS IDADE 
FROM CLIENTE

Desenvolvemos uma lógica utilizando o comando CASE. Neste caso, vamos verificar se o cliente já completou aniversário, comparando o mês de nascimento com o mês atual e comparando o dia de nascimento com o dia atual.


Comparação for verdadeira, basta diminuir o ano atual do ano de nascimento. Caso contrário (o cliente ainda não fez aniversário), basta diminuir 1 do valor anterior.


Neste artigo, abordamos as funções de conversão Cast() e Convert() e abordamos as melhores formas de manipular datas. Um post simples, direto e objetivo. Espero que tenham curtido.


Bons estudos e até o próximo!




Posts recentes

Ver tudo

Comments


bottom of page