tsql - 查找与给定 datetimeoffset 最接近的秒数
问题描述
我知道已经有很多关于这方面的资源,例如在 SQL Server 中查找最近的日期,但我不认为这是重复的,因为由于要求它会更深入。
我需要在过去或将来找到最接近给定日期/时间/偏移量的记录,直到最近的秒。
IF ( OBJECT_ID( N'[dbo].[MYTIMETABLE]' ) IS NOT Null )
DROP TABLE [dbo].[MYTIMETABLE];
GO
CREATE TABLE [dbo].[MYTIMETABLE]
(
[TIMESTAMP] datetimeoffset(0) NOT NULL,
[VALUE] char(3) NOT NULL
);
GO
用一些记录填充表,在我的例子中,最终会有数百万条记录,因此这个要求有点复杂。
SET NOCOUNT ON;
GO
WHILE ( ( SELECT COUNT(*) FROM [dbo].[MYTIMETABLE] ) < 1000 )
BEGIN
DECLARE @Script nvarchar(max) =
N'INSERT INTO [dbo].[MYTIMETABLE] ( [TIMESTAMP], [VALUE] )
SELECT DATEADD( ' +
CASE ( FLOOR( ( RAND() * 4 ) + 1 ) )
WHEN 1 THEN N'second'
WHEN 2 THEN N'minute'
WHEN 3 THEN N'hour'
WHEN 4 THEN N'day'
END +
N', ' +
CASE ( FLOOR( RAND() * 2 ) )
WHEN 0 THEN N'-'
WHEN 1 THEN N''
END +
CONVERT( nvarchar, FLOOR( ( RAND() * 100 ) + 1 ) ) +
N', SWITCHOFFSET( SYSDATETIMEOFFSET(), ''' +
CASE ( FLOOR( RAND() * 2 ) )
WHEN 0 THEN N'-'
WHEN 1 THEN N'+'
END +
N'0' +
CONVERT( nvarchar, FLOOR( RAND() * 10 ) ) +
N':00'' ) ), ' +
CONVERT( nvarchar, FLOOR( ( RAND() * 100 ) + 1 ) );
--RAISERROR( @Script , 0, 1 ) WITH NOWAIT;
EXEC sp_executesql @Script;
END
GO
我想出的查找脚本:
DECLARE @DateTime datetimeoffset(0) = SYSDATETIMEOFFSET();
SELECT TOP(1) [Current Time] = @DateTime, [Time Difference] = DATEDIFF( second, [TIMESTAMP], @DateTime ), *
FROM [dbo].[MYTIMETABLE]
ORDER BY ABS( DATEDIFF( second, [TIMESTAMP], @DateTime ) );
我的问题是,这是该脚本的最佳版本吗?它看起来非常基本,我担心一旦它投入生产并且每天针对数百万条记录运行数千次查找,它会遇到性能问题。
该脚本将包含在一个函数中,以便可以对其进行编译以进一步优化它,但任何额外的性能改进建议都将受到高度赞赏。