2017-08-31 1 views
0

OrderSubmittedtimeに最も近いポーリング日時を取得しようとしています。最も近いポーリング日時は、日時が十分に近い場合は長い。SQLサーバーで特定の日時に最も近い前回または将来の日時を取得します。

create table Rosters 
(
OrderID int, 
PollingTime datetime 
,OrdersubmittedTime datetime 
)  

insert into Rosters values (1,'2017-08-07 11:30:00.000','2017-08-07 04:12:51.000') 
insert into Rosters values (1,'2017-08-07 12:13:34.000','2017-08-07 04:12:51.000') 
insert into Rosters values (1,'2017-08-07 03:30:00.000','2017-08-07 04:12:51.000') 
insert into Rosters values (1,'2017-08-08 00:30:00.000','2017-08-07 04:12:51.000') 
insert into Rosters values (2,'2017-08-05 10:30:00.000','2017-08-07 04:12:51.000') 
insert into Rosters values (2,'2017-08-06 11:30:00.000','2017-08-07 04:12:51.000') 
insert into Rosters values (2,'2017-08-08 00:30:00.000','2017-08-07 04:12:51.000') 

select * from Rosters

期待される結果セットがある:以下

このための一例である受注= 1 、最も近いポーリング時間は、「2017年8月7日3時30分になります。 00.000' と受注= 2のために、最も近いポーリング時間は次のようになります 『2017年8月6日11:30:00.000』

私は現在、以下のようなクエリを記述するために得ることができるが、それは正しくありません:

select PollingTime 
,OrdersubmittedTime 
,OrderID 
, abs(DATEDIFF(MINUTE,OrdersubmittedTime,PollingTime)) as ClosestPollingTime 
from Rosters 

親切におかげで、ありがとう。

+0

は+/-ポーリング値に「十分に近い」のためのあなたの条件は何であるかに「十分に近い」 –

答えて

1

あなたはDamien_The_Unbelieverからcommentに基づいて、秒ではなく分にフィルタリングするように変更(同じテーブルにサブクエリを結合し、そのようなあなたのClosestPollingTimeを使用して最も近い値を取るためにOUTER APPLYを使用することができます。

CREATE TABLE #Rosters 
(
    OrderID INT, 
    PollingTime DATETIME, 
    OrdersubmittedTime DATETIME 
); 

INSERT INTO #Rosters 
VALUES 
(1, '2017-08-07 11:30:00.000', '2017-08-07 04:12:51.000'), 
(1, '2017-08-07 12:13:34.000', '2017-08-07 04:12:51.000'), 
(1, '2017-08-07 03:30:00.000', '2017-08-07 04:12:51.000'), 
(1, '2017-08-08 00:30:00.000', '2017-08-07 04:12:51.000'), 
(2, '2017-08-05 10:30:00.000', '2017-08-07 04:12:51.000'), 
(2, '2017-08-06 11:30:00.000', '2017-08-07 04:12:51.000'), 
(2, '2017-08-08 00:30:00.000', '2017-08-07 04:12:51.000'); 


SELECT r.OrdersubmittedTime, 
     r.OrderID, 
     t.ClosestPollingTime 
FROM #Rosters AS r 
    OUTER APPLY 
    (
     SELECT TOP 1 
      r2.OrderID, 
      r2.PollingTime as ClosestPollingTime 
     FROM #Rosters AS r2 
     WHERE r2.OrderID = r.OrderID 
     ORDER BY ABS(DATEDIFF(SECOND, r2.OrdersubmittedTime, r2.PollingTime)) 
    ) t 
GROUP BY r.OrdersubmittedTime, 
     r.OrderID, 
     t.ClosestPollingTime; 

DROP TABLE #Rosters; 

生成:??

OrdersubmittedTime  OrderID  ClosestPollingTime 
2017-08-07 04:12:51.000 1   2017-08-07 03:30:00.000 
2017-08-07 04:12:51.000 2   2017-08-06 11:30:00.000 
+2

はおそらく以来、むしろminute' 'よりもsecond''使うべきでしょうか?データは明らかに秒単位の細かい値を持っています。それ以外の場合は、間違って同じ分以内に絆を得て、離れた値を選ぶことができます。 –

+0

@Damien_The_Unbelieverが同意した、私は盲目的にOPからのDIFFコードを使用して、 – Tanner

+0

を更新します。ありがとう、タナー、非常に有益なanswer.Itは期待どおりに動作しますか?貴重なアドバイス。 – Deepak

関連する問題