You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中获取完整毫秒数及更高精度的时间值?

在SQL Server中获取高精度时间(毫秒+微秒+纳秒)的方法

嘿,这个问题我之前帮同事排查过,咱们一步步来理清楚~

首先,你遇到的核心问题是:DATEPART(MILLISECOND)这个函数本身只返回毫秒级的三位整数(0-999),不管你的DATETIME2(n)的精度n设置得多大。所以当n>3时,那些额外的微秒、纳秒级精度,是不会被MILLISECOND这个参数捕获到的——这就是为什么你看到DATETIME2(3)之后的结果都是264,因为DATEPART只取了前三位,后面的精度直接被忽略了。

那要获取更高精度的时间部分,有这几种实用的方法:

1. 获取带小数的完整精度毫秒值

如果你想要一个数值,既包含整数毫秒,又包含后面的微秒、纳秒精度,可以通过计算总纳秒数来转换:

DECLARE @Now DATETIME2(7) = SYSDATETIME();
SELECT 
    -- 结果精确到100纳秒(比如 264.2647,对应264毫秒+264微秒+700纳秒)
    FullPrecisionMilliseconds = DATEDIFF(NANOSECOND, CAST(@Now AS DATE), @Now) / 1000000.0;

逻辑很简单:从当天0点到当前时间的总纳秒数,除以1000000(1e6)就得到了带小数的毫秒数,每一位小数对应100纳秒的精度,完美匹配DATETIME2(7)的最高精度。

2. 拆分获取各精度段的独立数值

如果需要分别拿到毫秒、微秒、纳秒的具体数值,可以直接用DATEPART的对应参数:

DECLARE @Now DATETIME2(7) = SYSDATETIME();
SELECT 
    [毫秒部分] = DATEPART(MILLISECOND, @Now),
    [微秒部分] = DATEPART(MICROSECOND, @Now) % 1000, -- MICROSECOND返回0-999999,取后三位就是毫秒后的微秒
    [纳秒部分] = DATEPART(NANOSECOND, @Now) % 1000, -- NANOSECOND返回0-999999999,取后三位是微秒后的纳秒
    -- 合并成一个完整的高精度整数(比如 264264700,代表264ms+264μs+700ns)
    [合并高精度数值] = DATEPART(MILLISECOND, @Now) * 1000000 + DATEPART(MICROSECOND, @Now) * 1000 + DATEPART(NANOSECOND, @Now) % 1000;

3. 从字符串提取完整小数部分

另一种直观的方式是把DATETIME2(7)转成标准格式的字符串,提取小数点后的7位(这部分就是秒之后的所有精度):

DECLARE @Now DATETIME2(7) = SYSDATETIME();
SELECT 
    -- 提取秒后的7位精度字符串(比如 '2642647')
    FractionalSecondsString = SUBSTRING(CONVERT(VARCHAR(30), @Now, 121), CHARINDEX('.', CONVERT(VARCHAR(30), @Now, 121)) + 1, 7),
    -- 转换成数值后除以10000,得到带精度的毫秒值
    FullPrecisionMilliseconds = CAST(SUBSTRING(CONVERT(VARCHAR(30), @Now, 121), CHARINDEX('.', CONVERT(VARCHAR(30), @Now, 121)) + 1, 7) AS BIGINT) / 10000.0;

最后补充

DATETIME2(n)的n值定义的是秒后的小数位数:n=1是100ms精度,n=3是毫秒精度,n=7是最高的100纳秒精度。要利用这些精度,就得避开只返回三位的DATEPART(MILLISECOND),改用上面的方法来捕获完整的时间细节。

内容的提问来源于stack exchange,提问作者Jamie Twells

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:57:19