Найти ближайшую секунду к указанному смещению - PullRequest
1 голос
/ 11 октября 2019

Я понимаю, что об этом уже было много ресурсов, например Найти ближайшую дату в 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 ) );

MyВопрос в том, является ли это наиболее оптимальной версией этого скрипта? Это выглядит очень просто, и я обеспокоен тем, что, как только он поступит в производство и будет выполнять тысячи поисков в день по миллионам записей, у него будут проблемы с производительностью.

Сценарий будет размещен в функции, так чтоего можно скомпилировать для дальнейшей оптимизации, но любые дополнительные рекомендации по улучшению производительности будут высоко оценены.

...