使用 SQL DATETIME 规则舍入 DateTime

Round DateTime using SQL DATETIME rules

假设有一些代码将 DateTime 对象与 保存并从 SQL 服务器返回 的 DateTime 对象进行比较,存储在 DATETIME 对象中。

比较是在 hh:mm:ss-equality 上进行的,但是 SQL 服务器 'changes' 第二个组件在保存时可能会导致比较失败 ~1.5/1000时间左右。

这是因为 SQL 服务器 will round/truncate this value 在数据库中保存为 DATETIME 值时:

datetime values are rounded to increments of .000, .003, or .007 seconds..

是否有执行相同舍入的(标准)C#/.NET 函数?

此问题的主要目标是在保存之前标准化值,以用于比较。也就是说,F(original) == F(saved) 应该始终为真。

总体最终目标是确保保存值 'within the correct second',这样 hh:mm:01.999 就会存储为 hh:mm:01.997。这将允许 hh:mm:ss-equality 比较是可靠的,无论是对原始 DateTime 值还是恢复值进行比较。在这种情况下,original.Second == F(original).Second 也应该始终为真。

无论好坏,一个广泛使用的假设是每 hh:mm:ss 进行一次比较,因此 2 毫秒的简单 epsilon 比较是不可能的;尽管我不反对强烈争论的比较函数,它也可能解决最终目标。

SqlDateTime structure 存储 date/time 值的方式与 SQL 服务器的 datetime 类型相同。它提供与 .NET DateTime 类型之间的转换,并在执行转换时进行舍入。

请注意,您的问题中有自相矛盾的要求。您说您想要与 SQL 服务器相同的舍入。您还说您希望舍入永远不会更改 "second" 组件。你不能两者兼得。如果您需要不更改 "second" 组件,您可能需要自己实现它。您可以在转换完成后检查秒是否更改,然后恢复它,或者您可以自己实现转换以始终向下舍入。