segunda-feira, 12 de novembro de 2007

Trabalhando com Datas no SQL Server

Um assunto muito recorrente nos fóruns de discussão, é o tratamento de campos de data/hora no SQL Server.

O problema basicamente se resume a dois pontos:
- passagem de parâmetros para um comando SQL;
- exibição de data/hora em algum formato específico.

Sobre a passagem de parâmetros, o formato padrão do SQL Server é o americano (USA): mm/dd/yyyy. Desta forma, 10/04/2007 seria dia 04 de Outubro de 2007.

Ainda sobre a passagem de parâmetros, ela se dá em 2 momentos:
- através da aplicação (Delphi, VB, etc.);
- via T-SQL, em stored procedures, triggers, por exemplo.

Eu diria que na passagem de parâmetros via aplicação - utilizando os recursos normais dos componentes de acesso a dados - não há com o que se preocupar, uma vez que o componente de acesso a dados vai se encarregar de fazê-lo, e informar o parâmetro no formato devido.

E por último, quando houver necessidade de informar uma data manualmente, "na unha", eu sugeriria fazê-lo da seguinte forma, utilizando o exemplo acima: "dd-mes-yyyy".

Ex.:

SELECT *
FROM Pedidos
WHERE DataPedido BETWEEN '01-oct-2007' AND '31-dec-2007'

Percebam que eu coloquei o nome do mês, de forma abreviada (em inglês). É isto mesmo !
Faz 10 anos que esta fórmula tem dado certo para mim... por isso a recomendo.

Não preciso me preocupar com barras ou se a primeira parte é o mês ou dia... passo desta forma e está resolvido.

Ok, uma vez que a passagem de parâmetros está esclarecida, vamos a segunda parte: a exibição.

Em primeiro lugar, gostaria de colocar que se tem alguém que deve se preocupar com exibição de datas, o responsável é a aplicação front-end.

Banco de dados não foi feito pra formatar datas e/ou números. Banco de dados foi feito pra armazenar dados, e retornar, da forma mais rápida possível e confiável.

Porém, às vezes, desejamos efetuar um SELECT e imprimir o resultado, precisamos formatar as datas.

Aí vai a dica: converta o campo data/hora para texto.

Ex.:

SELECT CONVERT(VARCHAR(20), GETDATE(), 101) AS Data

Notem o 3o. parâmetro - código 101.

No BOL (Books OnLine) existe uma tabela de códigos para este parâmetro, que vai de 101 até 130.

O padrão britânico/francês, por exemplo, que possui o formato mais próximo do nosso (dd/mm/yy), é o código 103.

Teste os formatos e encontre o mais apropriado para sua necessidade.

Abraços e até a próxima!

quinta-feira, 1 de novembro de 2007

SQL 2005 Cumulative Update Package #4

A Microsoft liberou em 17 de outubro de 2007, um novo pacote de atualizações acumuladas para o banco de dados SQL 2005 (após o Service Pack 2).

A maioria dos bugs corrigidos estão relacionados a ferramentas auxiliares do SQL, tais como Integration Services, Analysis Services, ou ainda, recursos menos utilizados, como replicação e database mirroring.

Porém, um bug em particular chamou a atenção, foi o de 50001716, que foi identificado por deixar as queries mais lentas do que na versão 2000, quando utilizado o operador LIKE. Segundo a Microsoft, o engine escolhe a versão sub-otimizada do plano de execução quando encontra este operador.

Segue link para mais detalhes.

http://support.microsoft.com/kb/941450/LN/