首页 > 解决方案 > 有没有办法以 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 结构的精度。

它的精度为 100ns,因此理想情况下它的精度为 100ns。并且您将能够接到两个电话SYSDATETIME以返回:

编辑:是的,理想情况下它将具有与其精度相匹配的精度。这在现实中可能不会发生 - 但理想情况下它确实具有匹配的准确性。

所以我们尝试一下

我们设置了一个紧密的循环,并等待调用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 ms。

这就是微软创建GetSystemTimePreciseAsFileTime的原因,它允许以低至 100 ns 的精度获取当前时间。

datetime2有没有办法以0.0000001 秒(100 ns)的完整精度获得当前时间?

标签: sql-server

解决方案


可用的最大精度日期时间是 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

推荐阅读