为什么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个字节。不过,我的基本问题仍然存在。
我不知道完整的内部细节或选择背后的动机,但datetime
在内部存储为两个4字节整数。一个代表日期,另一个代表时间。我怀疑,由于SQL Server的第一个版本以来对tick/毫秒的处理方式,您在后者中丢失了一些精度,但我不知道底层实现的详细信息。
更多背景信息的相关问题:
-
sql server中日期时间的内部表示形式是什么?
-
允许实体框架4.5将datetime2与SQL Server CE4 一起使用
为了在不移动二进制格式中的值的情况下支持您想要的精度,我建议使用LocalDB,它具有与Compact相同的可移植性优势,但没有许多功能限制(例如支持更精确的datetime2
类型-我向您保证它需要6-8个字节,而不是54:-))。