【发布时间】: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 个字节。不过,我的基本问题仍然存在。
【问题讨论】:
-
我也不认为 Compact 支持
datetime2。在“常规”SQL Server 中,它是certainly does not take 54 bytes (rather 6, 7 or 8 bytes)。你能引用这个nvarchar(27)位的官方来源吗? -
再看一遍,我认为你在这两个方面都是对的。这是我正在寻找但显然不够近的地方...msdn.microsoft.com/en-us/library/bb677335(v=sql.100).aspx
-
是的,这是字符串表示的长度,而不是存储大小。
-
是的,整个运行时为 33 MB。 I wrote up a lengthy article about it here 和 official documentation starts here。
标签: c# sql-server datetime sql-server-ce datetime2