使用 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" 组件,您可能需要自己实现它。您可以在转换完成后检查秒是否更改,然后恢复它,或者您可以自己实现转换以始终向下舍入。
假设有一些代码将 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" 组件,您可能需要自己实现它。您可以在转换完成后检查秒是否更改,然后恢复它,或者您可以自己实现转换以始终向下舍入。