sql-server - 有没有办法以 0.0000001 秒的完全精度将当前时间作为 datetime2(7) 获取?
问题描述
在 SQL Server 中,datetime2(7)
精度为小数点后 7 位,例如:
2020-10-20 19:12:22.5294497
\_____/
|
seven decimal places
(100 ns precision)
这对应FILETIME
于 Windows 中基于 100 ns 滴答数的 Windows 结构的精度。
FILETIME
计算自1601-01-01以来的 100 ns 滴答数datetime2(7)
计算自午夜以来的 100 ns 滴答数
它的精度为 100ns,因此理想情况下它的精度为 100ns。并且您将能够接到两个电话SYSDATETIME
以返回:
2020-10-20 19:12:22.5294497
2020-10-20 19:12:22.5294498
编辑:是的,理想情况下它将具有与其精度相匹配的精度。这在现实中可能不会发生 - 但理想情况下它确实具有匹配的准确性。
所以我们尝试一下
我们设置了一个紧密的循环,并等待调用SYSDATETIME
返回一个与之前调用不同的值:
DECLARE @rc int = 0;
DECLARE @dt1 datetime2(7) = SYSUTCDATETIME();
WHILE @rc < 20
BEGIN
DECLARE @dt2 datetime2(7) = SYSUTCDATETIME();
--Next the next highest datetime value
WHILE @dt1 = @dt2
BEGIN
--PRINT 'Incremeting datetime due to collision: '+CAST(@dt1 AS varchar(50))+' = '+CAST(@dt2 AS varchar(50))
SET @dt2 = SYSUTCDATETIME();
END
PRINT CAST(@dt2 AS varchar(50))+' (delta: '+CAST(DATEDIFF(ns, @dt1, @dt2) AS varchar(50))+' ns)'
SET @rc = @rc+1;
SET @dt1 = @dt2;
END
当我们运行它时,我们看到它始终需要 15,569,800 nsSYSDATETIME
才能返回一个不同的值:
2020-10-20 19:12:21.4707033 (delta: 15569800 ns)
2020-10-20 19:12:21.4862731 (delta: 15569800 ns)
2020-10-20 19:12:21.5018429 (delta: 15569800 ns)
2020-10-20 19:12:21.5174127 (delta: 15569800 ns)
2020-10-20 19:12:21.5329825 (delta: 15569800 ns)
2020-10-20 19:12:21.5485523 (delta: 15569800 ns)
2020-10-20 19:12:21.5641221 (delta: 15569800 ns)
2020-10-20 19:12:21.5796919 (delta: 15569800 ns)
2020-10-20 19:12:21.5952617 (delta: 15569800 ns)
2020-10-20 19:12:21.6108315 (delta: 15569800 ns)
2020-10-20 19:12:21.6264013 (delta: 15569800 ns)
2020-10-20 19:12:21.6419711 (delta: 15569800 ns)
2020-10-20 19:12:21.6575409 (delta: 15569800 ns)
2020-10-20 19:12:21.6731107 (delta: 15569800 ns)
2020-10-20 19:12:21.6886805 (delta: 15569800 ns)
2020-10-20 19:12:21.7042503 (delta: 15569800 ns)
2020-10-20 19:12:21.7198201 (delta: 15569800 ns)
2020-10-20 19:12:21.7353899 (delta: 15569800 ns)
2020-10-20 19:12:21.7509597 (delta: 15569800 ns)
2020-10-20 19:12:21.7665295 (delta: 15569800 ns)
这种准确性是熟悉的:
- 15,569,800 纳秒
- 15,569.8 微秒
- 15.5698 毫秒
我们认为它是一种常见的硬件时钟频率——它将任何时钟的分辨率限制在~15 ms。
这就是微软创建GetSystemTimePreciseAsFileTime的原因,它允许以低至 100 ns 的精度获取当前时间。
datetime2
有没有办法以0.0000001 秒(100 ns)的完整精度获得当前时间?
解决方案
可用的最大精度日期时间是 datetimeoffset(7)。根据文档,提供的时间范围是 00:00:00 到 23:59:59.9999999,精确到 100 纳秒。您可以创建一个具有最大精度列的表,如下所示
drop table if exists #tTable;
go
create table #tTable(max_precision_dto datetimeoffset(7));
insert #tTable(max_precision_dto) values (sysdatetimeoffset());
select * from #tTable;
输出
max_precision_dto
2020-10-20 20:06:34.6490280 +00:00
推荐阅读
- javascript - ESLint 没有找到 React Native 组件
- python - 结合具有不同索引的两个系列并仅保留交集
- hibernate - 如何在休眠限制中检查 sysdate - 1
- flutter - 固定行数,芯片水平滚动
- sql - 将计数器参数传递给 postgres sql 脚本
- sql-server-2016 - 如何/我可以在连接字符串中指定 SQL Server Native Client OLE DB (SQLNCLI) 的版本
- android - 在通知中将播放按钮更改为暂停按钮
- parameter-passing - V10 将 One2Many 值传递给瞬态模型 One2Many(来自 onchange 的 TypeError 和默认的 DataError)
- c# - C#-Selenium - Windows 文件上传窗口冻结
- apache-spark - 在 k8s 上运行 spark 作业时无法从 GCP 存储桶中提取 jar