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.
Link Comando CAST e CONVERT: https://docs.microsoft.com/pt-br/previous-versions/sql/compact/sql-server-compact-4.0/ms174450(v=sql.110)?redirectedfrom=MSDN
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!
Comments