Descobri um problema ao inserir dados em nosso banco de dados. Minha instrução de inserção estava verificando a existência de dados na cláusula WHERE para evitar a inserção de dados duplicados. Nenhum foi detectado e o INSERT aconteceu. No entanto, a restrição exclusiva rejeitou os dados porque já existiam no banco de dados.
O problema era que os dados a serem inseridos eram DATETIMEOFFSET(2) e o campo do banco de dados inserido era DATETIME.
Para mostrar que você quer que eu esteja falando, execute o seguinte:
DECLARE @dt DATETIME = '2014-07-07 09:49:33.000';
DECLARE @dto DATETIMEOFFSET(2) = '2014-07-07 09:49:33.00 +07:00';
PRINT CASE WHEN @dt = @dto THEN 'Equals matches'
ELSE 'Equals does not match'
END
PRINT CASE WHEN @dt = CAST(@dto AS DATETIME) THEN 'Cast matches'
ELSE 'Cast does not match'
END
Ele imprime:
- Igual não corresponde
- Transmitir partidas
O operador de comparação (=) não funciona da mesma forma que a conversão implícita se você inserir os dados. Na verdade, o operador cast/convert descarta o deslocamento! Loucura.
Por que o operador de comparação funciona de maneira diferente da conversão implícita que ocorre durante um INSERT?