Neste post veremos novas funções do SQL 2012  - Conversion, Logical, String e Date/Time

1) CONVERSION FUNCTIONS - PARSE, TRY_PARSE e TRY_CONVERT
Vamos começar com a função PARSE. É parecida com a Convert, mas tem algumas particularidades, o parâmetro de entrada deve ser uma string e na saída você pode definir a cultura.

1.1) PARSE
Vamos executar estes comandos:
Select PARSE('0.02315' as money) 
Select PARSE('002315' as int) 
select datename(month,(PARSE('5/12/2012' as datetime using 'pt-br'))) 
select datename(month,(PARSE('5/12/2012' as datetime using 'en-us'))) 
select PARSE('30/12/2012' as date using 'pt-br') 




1.2) TRY_PARSE
O comando abaixo retorno um erro, para nos ajudar no tratamento foi criado o comando TRY_PARSE que retorna null em caso de erro.

select PARSE('30/12/2012' as datetime)
select TRY_PARSE('30/12/2012' as datetime)

1.3) TRY_CONVERT
Caso o valor origem não seja uma string, continue usando o CONVERT.
porém agora existe o TRY_CONVERT, que assim como o TRY_PARSE, retorna NULL em caso de erro.

Quando é uma conversão permitida, mas com erro, ele retorna null
select TRY_CONVERT(int, '4s')

Quando é uma conversão não permitida, ele retorna erro
select TRY_CONVERT(xml, 4)




2)LOGICAL FUNCTIONS - CHOOSE, IIF

2.1) CHOOSE
O comando CHOOSE é uma forma mais limpa de fazer um CASE, ele utiliza valores sequenciais a partir de 1.

Declare @Cargo int
Set @Cargo=2
ANTIGO:
Select CASE When @Cargo=1 then 'Estagiário' 
        When @Cargo=2 then 'Analista' 
        When @Cargo=3 then 'Coordenador'
        When @Cargo=4 then 'Gerente'
END 

NOVO:
Select CHOOSE(@Cargo, 'Estagiário','Analista','Coordenador','Gerente') 




Como ele não tem o ELSE, podemos ajustar com o ISNULL:
Select ISNULL(CHOOSE(@Cargo, 'Estagiário', 'Analista', 'Coordenador', 'Gerente'), 'Sem Valor')

2.2) IIF
O comando IIF é um velho conhecido e finalmente chegou ao SQL Server.
Ele utiliza a estrutura IF-THEN-ELSE, mas de uma forma mais limpa.
IIF(Condição, se verdadeiro, se falso)

Declare @Cargo int
Set @Cargo=2
ANTIGO:
IF @Cargo=4
     Print 'Gerente'
ELSE
      Print 'Outro'

NOVO:
PRINT IIF(@Cargo=4,'Gerente','Outro')
Na parâmetro condição, também pode ser usado IN, Like, Exists, etc


3) STRING FUNCTIONS

3.1) CONCAT - Resulta a concatenação de vários argumentos
Criação do Ambiente de Teste:

Create table Funcoes
(
Codigo int identity primary key,
Nome varchar(50),
Sobrenome varchar(50)
)
INSERT INTO Funcoes VALUES('José','Antonio'), ('Maria','Silva'), ('Pedro','Souza'), ('Carlos',NULL), ('João',NULL)
GO

Antes utilizávamos o operador "+" para concatenar, ficava desta forma:

Select 'Nome Completo: ' + Nome + ' ' + Sobrenome + '- Data: ' + convert(varchar,GETDATE()) as Coluna from Funcoes



Porém, ao concatenar com NULL ele retorna NULL.
Para corrigir isto, vamos utilizar o comando CONCAT_NULL_YIELDS_NULL.

SET CONCAT_NULL_YIELDS_NULL OFF -- Para concatenar com nulo

Select 'Nome Completo: ' + Nome + ' ' + Sobrenome + '- Data: ' + convert(varchar,GETDATE()) as Coluna from Funcoes

Agora podemos o utilizar a função CONCAT, além de ficar mais limpo, não foi preciso conversão e nem configurar o CONCAT_NULL_YIELDS_NULL.

Select CONCAT('Nome Completo: ', Nome, ' ', Sobrenome, '- Data: ', GETDATE()) Coluna from Funcoes




3.2) FORMAT
Mais uma alternativa para o Convert e o Cast. Utiliza a cultura do .Net Framework.

Neste exemplo formateremos com o parâmetro "d"(Data) e o "c"(Moeda)

Declare @Hoje date = getdate()

Select Format(@Hoje, 'd', 'en-us') 
Select Format(@Hoje, 'd', 'pt-br')

Declare @Valor money = 100
Select Format(@Valor, 'c', 'en-us') 
Select Format(@Valor, 'c', 'pt-br') 
Select Format(@Valor, 'c', 'fr-fr')




4) DATE AND TIME FUNCTIONS

4.1) DATEFROMPARTS
Monta uma data. Parâmetros: (YEAR, MONTH, DAY)
SELECT DATEFROMPARTS(2012,4,11) as DATEFROMPARTS

4.2) TIMEFROMPARTS - Monta uma hora completa. Parâmetros: (HOUR, MINUTE, SECONDS, FRACTIONS, PRECISION)

O Parâmetro FRACTIONS depende de PRECISION. A quantidade de dígitos do FRACTIONS deve ser igual ao valor de PRECISION.
SELECT TIMEFROMPARTS(18, 16, 32, 300, 3) as TIMEFROMPARTS

4.3) DATETIMEFROMPARTS - Monta uma data/hora completa. Parâmetros: (YEAR, MONTH, DAY, HOUR, MINUTE, SECONDS, MILLISECONDS)
SELECT DATETIMEFROMPARTS(2011,3,25,21,5,32,122) as DATETIMEFROMPARTS

4.4) SMALLDATETIMEFROMPARTS - Monta uma data/hora. Parâmetros: (YEAR, MONTH, DAY, HOUR, MINUTE)
SELECT SMALLDATETIMEFROMPARTS(2012,6,4,14,35) as SMALLDATETIMEFROMPARTS

4.5) DATETIME2FROMPARTS - Monta uma data/hora completa Parâmetros: (YEAR, MONTH, DAY, HOUR, MINUTE, SECONDS, FRACTIONS, PRECISION)
SELECT DATETIME2FROMPARTS(2012,4,11,18, 16, 32, 300, 3) as DATETIME2FROMPARTS

4.6) DATETIMEOFFSETFROMPARTS - Monta uma data/hora completa com Fuso Horário. Parâmetros: (YEAR, MONTH, DAY, HOUR, MINUTE, SECONDS, FRACTIONS, HOUR_OFFSET, MINUTE_OFFSET, PRECISION)
SELECT DATETIMEOFFSETFROMPARTS(2012,4,11,18, 16, 32, 300, 3,30,3) as DATETIMEOFFSETFROMPARTS

4.7) EOMONTH - Retorna o último dia de um mês. Parâmetros: (START_DATE, [, MONTH_TO_ADD ])
SELECT EOMONTH (Getdate()) AS EsteMes, EOMONTH (Getdate(), 1) AS ProximoMes, EOMONTH (Getdate(), -1) AS MesAnterior