假设有一些代码将DateTime对象与已经保存并从SQL Server返回的DateTime对象进行比较,该对象存储在DATETIME对象中。
比较是在hh:mm:ss-equality上进行的,但是SQL Server可能会发生变化'保存后的第二个组件使比较失败~1.5 / 1000左右。
这是因为SQL Server will round/truncate this value在数据库中保存为DATETIME值时:
日期时间值四舍五入为.000,.003或.007秒的增量..
是否有(标准)C#/ .NET函数执行相同的舍入?
此问题的主要目标是将值之前规范化为保存,以便在比较中使用。也就是说,F(original) == F(saved)
应始终为真。
总体最终目标是确保将值保存在正确的秒内,以便将hh:mm:01.999存储为hh:mm:01.997。这将允许hh:mm:ss-相等比较是可靠的,无论是对原始DateTime值还是恢复值进行。在这种情况下,original.Second == F(original).Second
也应始终为真。
无论好坏,一个广泛使用的假设是每hh:mm:ss进行比较,因此2毫秒的简单epsilon比较出来了;虽然我不会反对强烈争论的比较函数,这也可能解决最终目标。
答案 0 :(得分:2)
SqlDateTime
structure以与SQL Server的datetime
类型相同的方式存储日期/时间值。它提供来自.NET DateTime
类型的转换,并在执行转换时进行舍入。
请注意,您的问题中存在相互矛盾的要求。你说你想要与SQL Server相同的舍入。你还说你希望舍入永远不会改变“第二”组件。你不可能两种方式。如果您需要“第二”组件不要更改,您可能需要自己实现。您可以在转换完成后检查第二个是否已更改,然后将其恢复,或者您可以自己实施转换以始终向下舍入。