我想查找任何大于谓词中提供的时间的记录,该记录来自一个只有类型的 C# Web 应用程序DateTime
。但是,SQL Server 返回的行等于提供的谓词值。为什么会这样?该ShipDateTimeUTC
列是一种datetime
数据类型。
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;
以下是结果,您可以看到 ShipDateTimeUTC 与谓词值匹配。我不希望它被包括在内。为什么它会被包括在结果中?
ShipDateTimeUTC
如果是一种数据类型,您将得到这种行为datetime
。datetime2(7)
具有比预期列隐式转换为的数据类型优先级更高的数据类型优先级datetime
datetime2(7)
有一个恼人的(†)“设计”行为,当转换为
datetime2(7)
诸如2024-08-07 00:14:11.363
转换为2024-08-07 00:14:11.3633333
(2024-08-07 00:14:11.367
并将转换为2024-08-07 00:14:11.3666667
)的值时经过这次隐式转换
2024-08-07 00:14:11.3633333
大于2024-08-07 00:14:11.3630000
。您应该将数据类型更改
@p__linq__1
为datetime
与列匹配,因为WHERE
无论如何都应避免子句中的隐式转换。我最初认为,如果出于某种原因你被困住了,
datetime2(7)
那么你需要更改要使用的值2024-08-07 00:14:11.3633333
以考虑到这一点。然而,混合数据类型的隐式比较行为实际上与显式转换数据类型的运行方式不同。小提琴以下所有内容都使用索引查找,
CAST
尽管† 这种行为(兼容级别 130 下的新行为)的原理是
我已经检查了 SQL Server 2000 在线书籍,其中确实提到
datetime
因此,尽管这种行为可能会导致意外结果,但它与始终记录的行为一致。
混合数据类型是个坏主意。如果数据库类型是 datetime,那么变量应该是 datetime。
您遇到的问题是,对于 ShipDateTimeUTC,将 datetime 隐式转换为 datetime2 将产生 2024-08-07 00:14:11.3633333,大于 2024-08-07 00:14:11.3630000。