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
我正在努力寻找从多个列和行中获取最接近值的最佳方法。在下面的代码中,我只从 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