C# 使用SQL日期时间规则舍入日期时间

C# 使用SQL日期时间规则舍入日期时间,c#,sql,datetime,rounding,precision,C#,Sql,Datetime,Rounding,Precision,假设有一些代码将DateTime对象与存储在DateTime对象中的已保存并从SQL Server返回的DateTime对象进行比较 比较是在hh:mm:ss等式上进行的,但SQL Server在保存时可能会“更改”第二个组件,这使得比较失败约1.5/1000次 这是因为SQL Server作为日期时间值保存在数据库中时: 日期时间值四舍五入为.000、.003或.007秒的增量 是否有一个(标准)C#/.NET函数进行相同的舍入 这个问题的主要目标是在保存之前对值进行规范化,以便在比较中使用。

假设有一些代码将DateTime对象与存储在DateTime对象中的已保存并从SQL Server返回的DateTime对象进行比较

比较是在hh:mm:ss等式上进行的,但SQL Server在保存时可能会“更改”第二个组件,这使得比较失败约1.5/1000次

这是因为SQL Server作为日期时间值保存在数据库中时:

日期时间值四舍五入为.000、.003或.007秒的增量

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

这个问题的主要目标是在保存之前对值进行规范化,以便在比较中使用。也就是说,
F(原始)==F(已保存)
应始终为真

总的来说,最终目标是确保“在正确的秒数内”保存值,以便将hh:mm:01.999存储为hh:mm:01.997。这将允许hh:mm:ss相等性比较是可靠的,无论是对原始日期时间值还是恢复的值进行比较。在本例中,
original.Second==F(original.Second
也应始终为真

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

存储日期/时间值的方式与SQL Server的
datetime
类型相同。它提供与.NET
DateTime
类型之间的转换,并在执行转换时进行舍入

请注意,您的问题中有相互矛盾的要求。您说您想要与SQL Server相同的舍入。您还表示希望舍入永远不会更改“第二个”分量。你不能两全其美。如果您需要不更改“第二个”组件,您可能需要自己实现它。转换完成后,您可以检查第二个是否已更改,然后将其还原,或者您可以自己执行转换以始终向下取整。

存储日期/时间值的方式与SQL Server的
日期时间类型相同。它提供与.NET
DateTime
类型之间的转换,并在执行转换时进行舍入


请注意,您的问题中有相互矛盾的要求。您说您想要与SQL Server相同的舍入。您还表示希望舍入永远不会更改“第二个”分量。你不能两全其美。如果您需要不更改“第二个”组件,您可能需要自己实现它。在转换完成后,您可以检查第二个是否已更改,然后将其恢复,或者您可以自己执行转换以始终向下取整。

是的~我只是在摸索选项。现在我倾向于按SQL进行舍入,然后进行修复,这样它就不会进行舍入。这将使.9985+值变为.997(在第一次四舍五入为.0后),但这也意味着代码可以“保持”相同的秒数。这确实意味着如果时间值应该均匀分布,则会出现统计异常,
.997
毫秒值变得比它们应该的更可能。这可能不会是一个问题,但你应该意识到这一点。我们(显然)当时并不成熟:啊~我只是在摸索选择。现在我倾向于按SQL进行舍入,然后进行修复,这样它就不会进行舍入。这将使.9985+值变为.997(在第一次四舍五入为.0后),但这也意味着代码可以“保持”相同的秒数。这确实意味着如果时间值应该均匀分布,则会出现统计异常,
.997
毫秒值变得比它们应该的更可能。这可能不会是一个问题,但你应该意识到这一点。我们(显然)当时并不成熟:D