2017-08-31 134 views
0

我想获得一个最接近的投票日期时间到OrderSubmittedtime其中最接近的投票日期时间可以是日期时间以前或将来的日期(+或 - )只要日期时间足够接近。获取过去或未来的最接近的日期时间在SQL Server中给定的日期时间

下面是这种情况的示例:

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

预期的结果集是: 对于订单ID = 1时,最接近的轮询时间将是“2017年8月7日03:30: 00.000' 和订单ID = 2,最接近轮询时间将是‘2017年8月6日11:30:00.000’

我现在能拿编写类似下面的查询,但不正确的:

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

请帮助我,谢谢。

+0

“足够接近”什么你有什么“足够接近”的+/-值轮询条件 –

回答

1

您可以使用OUTER APPLY加入同一个表的子查询,并使用从Damien_The_UnbelieverClosestPollingTime像这样(修改后在秒而不是分钟过滤,基于comment取最接近的值:

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',因为???数据显然具有精确到秒的数值。否则,你可能会在同一分钟内使关系错误并选择更远的值。 –

+0

@Damien_The_Unbeliever同意,我盲目地使用'DIFF'代码从OP,将更新 – Tanner

+0

感谢,丹拿,非常有帮助answer.It工作原理expected.How我能成为一个编码像你?,也感谢Damien_the_unbeliever您有价值的advice.cheers – Deepak

相关问题