2017-08-30 1 views
0

複数の列と行から最も近い値を取得する最善の方法を見つけるのに苦労しています。以下のコードではStartDateからSEQの番号のみを取得しますが、行1のEndDateが開始日よりも近いかどうかを知る必要があります(@ValidationTime)。SQL Server 2012:複数の列と行の最も近い日付を見つける

例えば@Validationtimeが10時10分であれば、行1は、最も近い値であるが、10:20が最後に2

行に近い、私は「最も近いスロットを」処理する(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 

答えて

0

使用例。 。どちらが近いかを確認するとき

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 
+0

はい、もちろんです!場合!なぜ私はそれを考えなかったのですか?ありがとうございました! – Andreas

関連する問題