SQL Server 2012:查找多列和多行的最近日期

SQL Server 2012 : finding the closest date, of muliple columns & rows

我正在努力寻找从多个列和行中获取最接近值的最佳方法。在下面的代码中,我只从 StartDate 中获取 SEQ 数字,但我还需要知道与 @ValidationTime 相比,第 1 行的 EndDate 是否比开始日期更近.

例如,如果 @Validationtime 是 10:10,则第 1 行是最接近的值,但 10:20 更接近第 2 行。

最后,我只处理"closest slot"(1行)。

我希望我用一种不太混乱的方式来解释它。 :)

DECLARE @ValidationTime as datetime

SET @ValidationTime = '2017-08-29 10:10:00.000'
--SET @ValidationTime = '2017-08-29 10:20:00.000'

DECLARE @table TABLE (ID INT, StartDate datetime, EndDate datetime);

INSERT INTO @table 
VALUES (1, '2017-08-29 08:00:00.000', '2017-08-29 10:00:00.000'),    
       (1, '2017-08-29 10:30:00.000', '2017-08-29 21:00:00.000'),    
       (1, '2017-08-30 08:00:00.000', '2017-08-30 10:00:00.000'),
       (1, '2017-08-30 19:00:00.000', '2017-08-30 21:00:00.000');

SELECT 
    ID, StartDate, EndDate, 
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ABS(DATEDIFF(MINUTE, StartDate, @ValidationTime))) AS SEQ
FROM 
    @table

用例。 .何时检查哪个更近

SELECT  ID, 
    StartDate, 
    EndDate, 
    ROW_NUMBER() OVER ( Partition by  ID
                Order by CASE   WHEN ABS(DateDiff(MINUTE,StartDate,@ValidationTime)) < ABS(DateDiff(MINUTE,EndDate,@ValidationTime))
                        THEN ABS(DateDiff(MINUTE,StartDate,@ValidationTime))
                        ELSE ABS(DateDiff(MINUTE,EndDate,@ValidationTime))
                        END
              ) AS SEQ
FROM    @table