Eu tenho um banco de dados com um campo assim (não sei porque é varchar):
19950105
estou tentando convertê-lo para DATE como DDMMYYYY.
Eu poderia fazer isso com:
convert(varchar(10), cast(The_ugly_field as date),103)
Então minha data é:
01/05/1995
1) Por que não posso convertê-lo diretamente para data? se eu usar:
select convert(date,The_ugly_field,103) from Ugly_Table
ele retorna 1900-01-01
e não respeita o 103. qualquer número aí retorna o mesmo formato AAAA-MM-DD.
2) Agora a verdadeira questão. quando eu corro
select convert(varchar(10), cast(The_ugly_field as date),103)
From Ugly_Table
order by The_ugly_field
depois de algum tempo ele retorna este erro:
Msg 241, Level 16, State 1, Line 29 Falha na conversão ao converter data e/ou hora da cadeia de caracteres.
mas o engraçado é que não parece que os erros aparecem na mesma linha. Se eu executar esse código umas 4 vezes, toda vez que ele retornar o erro, ele diz uma linha diferente. Quer dizer, eu executo, então na aba "resultados" eu posso ver que ele retornou 1.234.555 rows
. Se eu rodar novamente, após o erro eu volto para a tabela "resultado" e agora a query rodou até 1.556.345
.
e por favor. como diabos posso converter isso 20140101
de uma maneira elegante para 2014/31/12
? A execução convert(date,E1_EMISSAO,103)
parece não respeitar o 103
e retorna 2017-02-24
e não 24/02/2017
.
toneladas de perguntas e respostas, mas é tudo sobre um simples convert().
O motivo pelo qual o erro ocorre depois que um número variável de linhas é processado é porque a conversão não é feita em uma ordem determinística. Depende do plano de execução.
E especialmente se a consulta for paralela (dado o número de linhas, espero que seja), as linhas serão distribuídas de maneira diferente entre os encadeamentos em cada execução e podem atingir o "Compute Scalar" em uma ordem diferente a cada vez.
Outras razões são que diferentes índices podem ser usados (resultando em linhas sendo ordenadas de forma diferente), embora isso pareça menos provável devido à natureza estática da consulta.
O motivo pelo qual o parâmetro de formatação não funciona quando você faz isso:
...é porque o estilo 103 que você está tentando usar é para converter uma data ou data e hora em um tipo de dados de caractere. Não é um varchar para uma data (que é o que essa instrução CONVERT faz). Nesse caso, o SQL Server está apenas exibindo a data no formato padrão para a instância.
Você precisará rastrear manualmente os dados "ruins" que não podem ser convertidos:
MAXDOP 1
dica à consulta para tornar a ordem dos dados retornados um pouco mais determinísticaSELECT
sem a conversão e inspecione manualmente os valores nessa áreaCASE
instrução aoSELECT
para evitar tentar converter valores ruins, como este:Eu sugeriria
TRY_CONVERT
, mas isso só está disponível no SQL Server 2012 e superior.