模拟 SQL 存储对 C# DateTime 的影响

Emulating impact of SQL storage on C# DateTime

我发现了一个不幸的副作用,即从 SQL 服务器日期时间列存储和补充 C# DateTime 会稍微改变它,因此相等运算符不再有效。

例如,使用 EF:

FileInfo fi = new FileInfo("file.txt");
Entity.FileTimeUtc = fi.LastWriteTimeUtc;

我们发现

(Entity.FileTimeUtc == fi.LastWriteTimeUtc)  // true

但如果我们保存该实体然后从 SQL 服务器重新加载它,我们会发现

(Entity.FileTimeUtc == fi.LastWriteTimeUtc)  // false

我知道由于 .NET DateTime 和 SQL 日期时间之间的内部存储格式不同,此处发生了舍入过程(即使只有几毫秒)。

我正在寻找的是一个能够可靠地模拟此转换并将本机 DateTime 值与已从 SQL 日期时间字段存储和再水合的值对齐的过程,以使相等性测试再次有效.

这是因为 SQL 服务器的 DateTime 类型以 3 和 4 毫秒“滴答”计算时间,并使用一些非常奇怪的“舍入”规则。

请参阅 my answer to the question, "How does SqlDateTime do its precision reduction?" 了解有关这些舍入规则的详细信息。

这将允许您在 .Net 中进行完全相同的转换。

此外,我相信如果将您的 C#/.Net DateTime 值转换为 System.Data.SqlTypes.SqlDateTime 将进行相同的转换(但我不能发誓 - 已经有一段时间了我不得不为此争论不休)。