Tsql 查找距离给定datetimeoffset最近的秒数

Tsql 查找距离给定datetimeoffset最近的秒数,tsql,sql-server-2016,Tsql,Sql Server 2016,我知道已经有很多关于这方面的资源,例如,但我不认为这是一个重复,因为由于需求,它进入了更深入的领域 我需要在过去或将来找到最接近给定日期/时间/偏移量的记录,精确到最近的秒 IF ( OBJECT_ID( N'[dbo].[MYTIMETABLE]' ) IS NOT Null ) DROP TABLE [dbo].[MYTIMETABLE]; GO CREATE TABLE [dbo].[MYTIMETABLE] ( [TIMESTAMP] datetimeoffset(0)

我知道已经有很多关于这方面的资源,例如,但我不认为这是一个重复,因为由于需求,它进入了更深入的领域

我需要在过去或将来找到最接近给定日期/时间/偏移量的记录,精确到最近的秒

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
我的问题是,这是这个脚本的最佳版本吗?它看起来非常基本,我担心一旦它投入生产,并且每天对数百万条记录进行数千次查找,它将遇到性能问题


脚本将包含在一个函数中,以便对其进行编译以进一步优化,但如果有任何额外的性能改进建议,我们将不胜感激。

您能将列添加到您的时间表中吗?@ZoharPeled您是否在问我是否能将更多列添加到该表中?当然,我会考虑在订购之前把日期列添加到文件中。问题是,查询可能发生在一月一日午夜1秒之后。这意味着它必须回到上一年才能得到最接近的值。你能在你的时间表中添加列吗?@ZoharPeled你是在问我是否能在表中添加更多列吗?当然,我会考虑在订购之前把日期列添加到文件中。问题是,查询可能发生在一月一日午夜1秒之后。这意味着它必须有效地回到上一年,以获得最接近的值。
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 ) );