Estou desenvolvendo ETL a partir de um arquivo onde as datas são expressas no formato "DDMMAAAA", exemplo "31012016".
Eu gostaria de pegar essa string e passar diretamente para o texto SQL onde os dados serão inseridos. Não quero analisá-lo em C # DateTime para formatá-lo como "AAAA-MM-DD" para que o SQL Server o analise mais uma vez.
Como faço atualmente, a string de data é analisada uma vez por .Net, depois formatada por .Net e impressa no código SQL, depois analisada novamente por SQL Server. Quero pegar a string do arquivo simples e colocá-la diretamente no código SQL sem nenhuma conversão.
O SQL Server reconhece "YYYYMMDD", mas falha para "DDMMYYYY" com a mensagem:
A conversão falhou ao converter a data e/ou hora da cadeia de caracteres.
Exemplo:
DECLARE @datevar date = PARSE('31012016' as date using 'pt-BR');
SELECT @datevar;
Existe alguma maneira de fazê-lo funcionar?
Eu tentei, PARSE('31012016' as date using 'pt-BR')
mas levantei exceção. TRY_PARSE
retorna nulo. Também tentei CAST e CONVERT (Transact-SQL) , mas parece não existir esse estilo.
Quando uma data é representada por 8 numerais sem nenhum delimitador, o SQL Server sempre tentará interpretá-la como
YYYYMMDD
. Esse formato foi deliberadamente escolhido como independente de localidade ou cultura (sendo também um dos formatos de data padrão ISO 8601 , na verdade) e não há como o servidor interpretá-lo comoDDMMYYYY
ou de qualquer outra forma.Portanto, reorganize as partes de data da sua
DDMMYYYY
string para torná-laYYYYMMDD
:ou insira delimitadores para que corresponda a um dos formatos DMY delimitados conhecidos, por exemplo
DD/MM/YYYY
:Eu concordo que não há conversão direta, mas isso é bem simples, porém o desempenho será ruim, então fique com um pouco de manipulação de string!
Não, não consegui encontrar nenhuma maneira de convertê-lo implicitamente. Este é o mais simples que eu poderia inventar.