sábado, 24 de setembro de 2011

SQL Server: ISNUMERIC retorna falso positivos

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/09/23/SQL-Server-ISNUMERIC-retorna-falso-positivos.aspx


A função ISNUMERIC retorna alguns falsos positivos em determinadas situações. Alguns dos casos são: para sinais de "$" (cifrão), "-" (menos), espaço e tab.

Uma maneira de evitar isso é adicionar "e0" ao final do dado que será testado. Isso fará o número ficar num formato científico, o que na prática multiplica o número por 1. Caso seja algum dos sinais citados acima, a função ISNUMERIC irá retornar 0, pois não é um número (por exemplo: "$e0").

Caso o número a ser testado já esteja num formato científico, ISNUMERIC retornará 0, pois, por exemplo "1.234e4e0" não é um valor numérico válido. Para lidar com isso, antes de adicionar "e0" ao número a ser testado, pode ser interessante testar antes para ver se o número contém a letra "E" nele. Caso contenha, basta colocar esse valor na função ISNUMERIC para fazer o teste. Caso contrário, então deverá ser adicionado "e0" após o valor.

SQL Server: Removendo a hora de um DATETIME

Esse post não será mais atualizado nesse blog. Para visualizar esse post em seu novo endereço, acesse:
http://milaneze.com.br/post/2011/09/23/SQL-Server-Removendo-a-hora-de-um-DATETIME.aspx


Existem várias formas de remover a hora de um valor DATETIME, porém qual é a melhor delas? Existe uma resposta bem completa nessa página do Stack Overflow: http://stackoverflow.com/questions/2775/whats-the-best-way-to-remove-the-time-portion-of-a-datetime-value-sql-server

Resumindo, no SQL Server 2008, a melhor forma seria:

DECLARE @DATA AS DATETIME
SET @DATA = CONVERT(DATE, GETDATE())


Porém, nas outras versões não existe o tipo DATE. Então, na ordem do mais rápido para o mais demorado, ficaria:

DECLARE @DATA AS DATETIME

-- mais rápido
SET @DATA = CAST(GETDATE() - 0.50000004 AS int)

-- segundo mais rápido e mais fácil de entender e lembrar
SET @DATA = DATEDIFF(DAY, 0, GETDATE())

-- terceiro mais rápido
SET @DATA = FLOOR(CAST(GETDATE() as float))


Conclusão: o melhor de se usar, por não ter muita diferença do primeiro e não confundir tanto, seria a segunda opção.