为什么 DATEDIFF 在第一次执行后结果会加倍?
Why would DATEDIFF double the result after first execution?
我正在使用以下技术粗略计算通过 SSMS (SQL Server Management Studio) 执行存储过程所用的时间:
USE [MyDB]
GO
DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;
SET @t1 = GETDATE();
DECLARE @TTIdsList dbo.TTIdsList_ident
INSERT INTO @TTIdsList(Id)
VALUES (7890137988314100)
DECLARE @return_value int
EXEC @return_value = [mySCH].[DataLoadByList]
@CaseIds = @TTIdsList
SELECT 'Return Value' = @return_value
SET @t2 = GETDATE();
SELECT DATEDIFF(microsecond,@t1,@t2) AS elapsed_us;
GO
它工作得很好,但 returns 第一次执行时的结果不同(3000 微秒)。在所有后续执行中,它 returns 加倍:6000 微秒。
我是否遗漏了这些变量的初始化方式?如果是这样,我错过了什么?
TSQL datetime
没有微秒分辨率。分辨率为 1/300 秒,四舍五入到小数点后三位。
这意味着如果实际经过的时间在 1/300 秒和 2/300 秒之间,您有时会得到 3 毫秒,有时会得到 6 毫秒的差异。
要获得实际值,您需要具有所需分辨率的时间测量。尝试使用数据类型 datetime2
和函数 SYSUTCDATETIME()
,它们确实有足够的精度来回答您的问题。
我正在使用以下技术粗略计算通过 SSMS (SQL Server Management Studio) 执行存储过程所用的时间:
USE [MyDB]
GO
DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;
SET @t1 = GETDATE();
DECLARE @TTIdsList dbo.TTIdsList_ident
INSERT INTO @TTIdsList(Id)
VALUES (7890137988314100)
DECLARE @return_value int
EXEC @return_value = [mySCH].[DataLoadByList]
@CaseIds = @TTIdsList
SELECT 'Return Value' = @return_value
SET @t2 = GETDATE();
SELECT DATEDIFF(microsecond,@t1,@t2) AS elapsed_us;
GO
它工作得很好,但 returns 第一次执行时的结果不同(3000 微秒)。在所有后续执行中,它 returns 加倍:6000 微秒。
我是否遗漏了这些变量的初始化方式?如果是这样,我错过了什么?
TSQL datetime
没有微秒分辨率。分辨率为 1/300 秒,四舍五入到小数点后三位。
这意味着如果实际经过的时间在 1/300 秒和 2/300 秒之间,您有时会得到 3 毫秒,有时会得到 6 毫秒的差异。
要获得实际值,您需要具有所需分辨率的时间测量。尝试使用数据类型 datetime2
和函数 SYSUTCDATETIME()
,它们确实有足够的精度来回答您的问题。