Olá pessoal!
Estou aqui mais uma vez “deitado” sobre o Trainning Kit estudando-o e pesquisando mais material na internet, o conteúdo de hoje é bem tranquilo de assimilar porém de uma grande importância no nosso dia-a-dia.
Bom proveito! 😀
O SQL Server 2008 nos prove um grande número de funções internas e podemos utilizá-las para aprimoras nossas queries.
Em muitos casos quando usamos uma função interna frequentemente logo após o nome da função adicionamos os “()” mesmo quando não temos nenhum parâmetro isso pode indicar para que o engine do banco utilize o valor atual, veremos alguns exemplos logo mais.
Bom. Vamos partir para a prática e ver um pouco do que o SQL Server 2008 nos proporciona, iremos ver alguns exemplos das funções mais utilizadas.
As primeiras que iremos ver serão as que trabalham com DATE e TIME.
As primeiras funções que iremos ver serão SYSDATETIME, SYSDATETIMEOFFSET, e SYSUTCDATETIME. todas as 3 nos retornam a hora. Elas são ideais caso tenhamos a necessidade de saber o horário preciso do sistema naquele momento.
Vejamos o exemplo:
SELECT SYSDATETIME() AS 'Hora Exata do Sistema', 'SYSDATETIME' AS 'Nome da Função' UNION SELECT SYSDATETIMEOFFSET(), 'SYSDATETIMEOFFSET' UNION SELECT SYSUTCDATETIME(), 'SYSUTCDATETIME'
Veja que o resultado foi exatamente igual e que para retornarmos a data e hora do sistema é extremamente simples, aproveitando o exemplo ainda colocamos o conceito de UNION que aprendemos na lição passada (Lição 4 – se tiver alguma dúvida volte uma lição e revise o conceito de UNION e suas regrinhas de funcionamento).
Agora se vc não tem a necessidade de tamanha precisão você pode utilizar as funções GETDATE, CURRENT_TIMESTAMP e GETDATE que ainda lhe proporciona um ganho de performance por retornar um conjunto de valores menor dos que as funções mostradas anteriormente.
Vejamos um mesmo modelo de exemplo:
SELECT GETDATE() AS 'Hora Exata do Sistema', 'GETDATE' AS 'Nome da Função' UNION SELECT CURRENT_TIMESTAMP, 'CURRENT_TIMESTAMP' UNION SELECT GETUTCDATE(), 'GETUTCDATE'
A única observação é a de que a função CURRENT_TIMESTAMP não necessita dos parenteses.
Agora se você tem a necessidade de apenas parte das informações podemos utilizar as funções DATEPART e DATENAME.
Vejamos alguns exemplos para melhorar explicar:
SELECT DATENAME(DAY, GETDATE()) AS 'Parte da data do Sistema', 'DATENAME' AS 'Nome da Função' UNION SELECT DATENAME(MONTH, GETDATE()), 'DATENAME' UNION SELECT (YEAR, GETDATE()), 'DATENAME'
Com o exemplo acima utilizando o DATENAME a informa que retorna é a especificada dentro da função, em especial quando solicitamos o mês o que nos é retornado é a string com o nome do mês corrente.
Vejamos agora um exemplo com DATEPART que tem a mesma função do exemplo anterior e o que difere as duas é que ela retorna apenas o valor numérico do mês e não mais a string.
SELECT DATEPART(DAY, GETDATE()) AS 'Parte da data do Sistema', 'DATEPART' AS 'Nome da Função' UNION SELECT DATEPART(MONTH, GETDATE()), 'DATEPART' UNION SELECT DATEPART(YEAR, GETDATE()), 'DATEPART'
Agora se quisermos adicionar alguns dias, meses ou anos devemos utilizar a função DATEADD, vejamos os exemplos.
SELECT DATEADD(YY, 5, GETDATE()) AS 'Resultado obtido' , 'DATEADD' AS 'Nome da função' , 'Adicionando 5 anos à partir da data atual' AS 'Observação' UNION SELECT DATEADD(DD, 25, GETDATE()), 'DATEADD', 'Adicionando 25 dias à partir da data atual' UNION SELECT DATEADD(MM, 8, GETDATE()), 'DATEADD', 'Adicionando 8 meses à partir da data atual'
Agora se quisermos o inverso, sabermos quanto tempo se passou, vejamos os seguintes exemplos:
SELECT DATEDIFF(YEAR, '1/21/1980', GETDATE()) AS 'Resultado obtido' , 'DATEIFF' AS 'Nome da função' , 'Quantidade em anos que tenho desde o meu nscimento' AS 'Observação' UNION SELECT DATEDIFF(DAY, '1/21/2001', GETDATE()), 'DATEIFF' , 'Quantidade em dias que tenho desde o meu nscimento' UNION SELECT DATEDIFF(MONTH, '1/21/2001', GETDATE()), 'DATEIFF' , 'Quantidade em meses que tenho desde o meu nscimento'
Já que estavamos tratando de hora e data, vamos dar uma olhada em uma função de sistema, apresentando-lhes a função CONVERT que nos auxilia convertendo os formatos de data e hora de acordo com a região e formato necessário.
Vejamos alguns exemplos:
SELECT CONVERT(VARCHAR(30), GETDATE()) AS 'Data', 'Estilo padrão' AS 'Descrição' UNION SELECT CONVERT(VARCHAR(30), GETDATE(),103), 'Estilo Britânico/Francês | dd/mm/aaaa' UNION SELECT CONVERT(VARCHAR(30), GETDATE(),111), 'Estilo Japonês | aa/mm/dd' UNION SELECT CONVERT(VARCHAR(30), GETDATE(),105), 'Estilo Italiano | dd-mm-aa'
Na tabela acima temos o formato que escolhemos para ser exibido e na segunda coluna a que região este padrão pertence seguido de uma máscara.
Veja tabela completa de estilos de formatação neste link: http://msdn.microsoft.com/pt-br/library/ms187928.aspx
String Functions
Vejamos agora as diversas funções que podemos utilizar para com strings.
- Left – Retorna o número de caracteres que for definido na função, iniciando da esquerda
- Right – Retorna o número de caracteres que for definido na função, iniciando da direita
- Upper – Retorna a string toda em maiúscula
- Lower – Retorna a string toda em minúscula
- Substring – Com esta função vc determina de que ponto a que ponto deve-se retornar o trecho da string
- Replace – Pesquisa dentro de uma string um conjunto de caracteres e substitui por outro que definimos
- RTrim – Remove os espaços em branco à direita de uma string
- LTrim – Remove os espaços em branco à esquerda de uma string
Vamos aos exemplos:
SELECT LEFT('Estudando para 70-433',5) AS 'Resultado Obtido', 'LEFT' AS 'Função' UNION SELECT RIGHT('Estudando para 70-433',5), 'RIGHT' UNION SELECT UPPER('Estudando para 70-433'), 'UPPER' UNION SELECT LOWER('Estudando para 70-433'), 'LOWER' UNION SELECT SUBSTRING('Estudando para 70-433',3,5), 'SUBSTRING' UNION SELECT REPLACE('Preparando para 70-433','Preparando','Estudando'), 'REPLACE' UNION SELECT RTRIM('Preparando para 70-433 '), 'RTRIM' UNION SELECT LTRIM(' Preparando para 70-433'), 'LTRIM'
E assim chegamos ao fim de mais uma Lição espero que tenham aproveitado e assimilado bem os conceitos, pois daqui para a frente eles serão essencias para as demais Lições visto que estaremos nos aprofundando cada vez mais e sempre que possível mesclando dois ou mais dos conceitos destas primeiras Lições.
Grande abraço, sucesso e nos encontramos no próximo post. 😉
Lucas A. Romão
Olá Lucas!
Excelente post, parabéns!
Muitas pessoas poderão ser ajudadas assim.
Forte abraço.