2017-08-30 53 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

使用CASE。 。什麼時候檢查哪個更近

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