Quero encontrar registros maiores que o tempo fornecido em meu predicado, que vem de um aplicativo Web C# no qual existe apenas type DateTime
. No entanto, o SQL Server está retornando uma linha igual ao valor do predicado fornecido. Por que está fazendo isso? A ShipDateTimeUTC
coluna é um datetime
tipo de dados.
DECLARE @p__linq__1 datetime2(7) = '2024-08-07 00:14:11.3630000';
SELECT
[OrderHeaderId],
Id,
[ShipDateTimeUTC]
FROM
[dbo].[ShippingContainerHeader]
WHERE
[ShipDateTimeUTC] > @p__linq__1;
Aqui estão os resultados onde você pode ver que ShipDateTimeUTC corresponde ao valor do predicado. Eu não quero que isso seja incluído. Por que está sendo incluído nos resultados?
Você obterá esse comportamento se
ShipDateTimeUTC
for umdatetime
tipo de dados.datetime2(7)
tem precedência de tipo de dados maior dodatetime
que você esperaria que a coluna fosse convertida implicitamente paradatetime2(7)
Há um comportamento irritante (†) "por design" que, ao converter para
datetime2(7)
valores como,2024-08-07 00:14:11.363
é convertido para2024-08-07 00:14:11.3633333
(e2024-08-07 00:14:11.367
seria convertido para2024-08-07 00:14:11.3666667
)Após esta conversão implícita
2024-08-07 00:14:11.3633333
ser maior que2024-08-07 00:14:11.3630000
.Você deve alterar o tipo de dados to
@p__linq__1
paradatetime
corresponder à coluna, pois as conversões implícitas naWHERE
cláusula devem ser evitadas de qualquer maneira.Inicialmente pensei que, se por algum motivo você estivesse preso
datetime2(7)
, precisaria alterar o valor a ser usado2024-08-07 00:14:11.3633333
para levar isso em consideração. No entanto, o comportamento de comparação implícita com tipos de dados mistos, na verdade, opera de maneira diferente do que com tipos de dados convertidos explicitamente. ViolinoTodos os itens abaixo usam uma busca de índice, apesar do
CAST
s† A justificativa para este comportamento ( novo no nível de compatibilidade 130 ) é
Eu verifiquei os livros on-line do SQL Server 2000 e isso diz para
datetime
Portanto, este comportamento é consistente com o que sempre foi documentado, embora possa causar resultados potencialmente inesperados.
Misturar tipos de dados é uma má ideia. Se o tipo de banco de dados for datetime, a variável deverá ser datetime.
O problema que você tem é que a conversão implícita de datetime para datetime2, para ShipDateTimeUTC, produzirá 2024-08-07 00:14:11.3633333 que é maior que 2024-08-07 00:14:11.3630000.