为什么SQL Server Compact中的日期时间类型会舍入值

本文关键字:类型 时间 舍入 日期 SQL Server Compact 为什么 | 更新日期: 2023-09-27 18:25:41

我遇到了一些让我惊讶的事情。

我正在使用WinPcap从网络上收集数据。在内部,WinPcap使用Windows性能计数器生成其时间戳。我知道它们会漂移,但这些时间戳的精度却低至微秒级。

如果我将这些时间戳作为datetime值插入SQL Server Compact 4.0数据库,并在以后提取它们,我会注意到精度已降至毫秒。

例如,

10:52:19.706084 -> 10:52:19.706000

现在,我在这里读到了SQL Server将datetime类型的值四舍五入到.000、.003或.007毫秒。这就解释了正在发生的事情。

现在,datetime字段使用8个字节来存储其数据,其中4个字节用于日期,4个字节表示自午夜以来的毫秒。但如果我调用DateTime.ToBinary(),我会得到一个8字节的数字,它表示所有精度的值。事实上,如果我在bigint列中将该值写入数据库,然后在提取该值时调用DateTime.FromBinary(),那么我将以相同的精度获得原始值。

这是我将要使用的方法,但我仍然很好奇:为什么SQLServerCompact中最初的datetime类型没有使用DateTime的ToBinary/FromBinary存储机制?

编辑:

正如Aaron Bertrand正确指出的那样,SQL Compact不支持datetime2。此外,datetime2使用6、7或8个字节,而不是常规SQL Server中的54个字节。不过,我的基本问题仍然存在。

为什么SQL Server Compact中的日期时间类型会舍入值

我不知道完整的内部细节或选择背后的动机,但datetime在内部存储为两个4字节整数。一个代表日期,另一个代表时间。我怀疑,由于SQL Server的第一个版本以来对tick/毫秒的处理方式,您在后者中丢失了一些精度,但我不知道底层实现的详细信息。

更多背景信息的相关问题:

  • sql server中日期时间的内部表示形式是什么?

  • 允许实体框架4.5将datetime2与SQL Server CE4 一起使用

为了在不移动二进制格式中的值的情况下支持您想要的精度,我建议使用LocalDB,它具有与Compact相同的可移植性优势,但没有许多功能限制(例如支持更精确的datetime2类型-我向您保证它需要6-8个字节,而不是54:-))。

相关文章: