Resolvendo problemas com datas no SQL Server
Um dos grandes problemas que surgem quando migramos uma base de dados Access para SQL Server é relacionado às datas. Isto por que o Access gerencia as datas de uma forma diferente do SQL Server, mesmo sendo ambos os softwares do mesmo fabricante, a Microsoft.
O Access, com o motor Jet/AceDAO, geralmente utiliza como referência de formato de data a máquina onde está instalado – em máquinas com Windows em inglês, por exemplo, as datas são formatadas como mês/dia/ano. Isto costuma gerar muita confusão, principalmente em ambientes onde o Windows está em português e o Office em inglês ou vice-versa. Já o SQL Server trata, por definição, as datas como ano/mês/dia.
Com isto, há o risco de as datas serem interpretadas erroneamente, por exemplo 03/02 (fevereiro) ser interpretado como março, ou vice-versa. Para fins de busca, é um elemento muito complicador, pois pode gerar um indicador errado e tornar o sistema não confiável. E isto, por consequência, pode impactar na relação entre o cliente e o desenvolvedor.
Ao longo dos anos enfrentamos este problema em diversas vezes, e por isso adotamos uma solução que compartilho neste artigo. Adotamos uma padronização nas datas, formatando todas como ano/mês/dia, sendo o ano com 4 dígitos e ps demais com 2. Ao ler a informação no banco de dados, adotamos a formatação visual de acordo com o idioma do sistema, e ao registrar as informações, revertemos a formatação. À primeira vista isto pode soar confuso, mas é uma solução viável e que resolve, em definitivo, o problema com a exibição e tratamento das datas.
Dou um exemplo: imagine uma tela onde você tenha um filtro de período, o usuário digita 01/02/2011 (1º de fevereiro de 2011) como início e 12/02/2011 como término. Ao solicitar a listagem (com base nos filtros), fazemos a conversão das datas para, respectivamente, 2011-02-01 e 2011-02-12 e enviamos o comando SQL para o servidor processar a informação. Ao retornar a informação na lista, revertemos o formato e exibimos 01/02/2011 e 12/02/2011. Com isso, não há como ocorrer falha na interpretação das datas, pois o formato informado é o padrão adotado pelo SQL Server.
Para uma maior eficiência na codificação, você pode transformar este processo em uma função independente, recebendo uma data e transformando-a em texto para o SQL.
Public Sub FormatarData(dtReferencia as Date) as String
FormatarData = "'" & Format(dtReferencia,"yyyy-mm-dd") & "'"
End Sub