Eu tenho um projeto etl onde a fonte tem 60 colunas datetime2 e o destino é inteiramente datetime.
Alguns dias atrás, acordamos com um data warehouse vazio porque um usuário em um hospital, para um paciente, inseriu a data da cirurgia '1220-01-01'.
Eu temporariamente contornei o problema colocando cada uma das colunas em uma função personalizada:
ALTER function [dbo].[scrub_datetime2](@date datetime2)
returns date
as
begin
declare @return date
set @return = case when @date <= '1800-01-01' then null else @date end
return @return
end
E isso funciona bem para se livrar do texto vermelho, mas também dobrou o tempo que o trabalho leva para ser executado. Fico feliz em fazer minha parte, mantendo os hamsters na sala do servidor aquecidos durante o Natal, mas não posso realmente justificar perder 2,5 horas do precioso tempo noturno para esse problema.
Pergunta Como verificar com mais eficiência se um valor datetime2 caberá em datetime?
Você deve usar a função TRY_CONVERT Documentos
Ele retornará null se o valor estiver incorreto
Se você estiver no SQL Server 2012 ou posterior e seu banco de dados estiver no nível de compatibilidade 110 ou superior, você poderá usar o
TRY_CONVERT
.Caso contrário, substituir uma função com valor de tabela embutida por sua função com valor escalar deve ajudar.