模拟 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 将进行相同的转换(但我不能发誓 - 已经有一段时间了我不得不为此争论不休)。
我发现了一个不幸的副作用,即从 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 将进行相同的转换(但我不能发誓 - 已经有一段时间了我不得不为此争论不休)。