【问题标题】:Why does the datetime type in SQL Server Compact round values?为什么 SQL Server Compact 中的 datetime 类型会舍入值?
【发布时间】:2013-08-01 02:33:31
【问题描述】:

我遇到了令我惊讶的事情。

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

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

例如,

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

现在,我从 here 读到 SQL Server 将 datetime 类型的值四舍五入为 0.000、0.003 或 0.007 毫秒。这就解释了正在发生的事情。

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

这就是我要使用的方法,但我还是很好奇:为什么SQL Server Compact中原来的datetime类型没有使用DateTime的ToBinary/FromBinary存储机制?

编辑:

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

【问题讨论】:

标签: c# sql-server datetime sql-server-ce datetime2


【解决方案1】:

我不知道完整的内部细节或选择背后的动机,但datetime 在内部存储为 - 本质上 - 两个 4 字节整数。一个代表日期,另一个代表时间。我怀疑你在后者中失去了一些精度,因为自 SQL Server 的第一个版本以来处理滴答/毫秒的方式,但同样,我不知道低级实现细节。

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

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

【讨论】:

  • 亚伦,非常感谢您的帮助。非常感谢。
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多