我遇到了令我惊讶的事情。
我正在使用WinPcap
从网络上收集数据。在内部,WinPcap
使用 Windows 性能计数器生成其时间戳。我知道它们会发生漂移,但这些时间戳仍然具有精确到微秒级的精度。
如果我将这些时间戳作为datetime
值插入到 SQL Server Compact 4.0 数据库中并稍后提取它们,我注意到精度已降至毫秒。
例如,
10:52:19.706084 -> 10:52:19.706000
现在,我从这里读到SQL Server 将datetime
类型为 0.000、0.003 或 0.007 毫秒的值舍入。这就解释了正在发生的事情。
现在,该datetime
字段使用 8 个字节来存储其数据,4 个字节用于日期,4 个字节用于自午夜以来的毫秒数。但是,如果我调用DateTime.ToBinary()
,我会返回一个 8 字节的数字,该数字代表其所有精度的值。事实上,如果我将这个值写入数据库的bigint
列中,然后DateTime.FromBinary()
在提取该值时调用,我会以相同的精度得到原始值。
这是我要使用的方法,但我还是很好奇:为什么datetime
SQL Server Compact中的原始类型没有使用DateTime
ToBinary/FromBinary的存储机制?
编辑:
正如 Aaron Bertrand 正确指出的那样,SQL Compact 不支持datetime2
. 此外,datetime2
在常规 SQL Server 中使用 6、7 或 8 个字节,而不是 54 个字节。不过,我的基本问题仍然存在。