Sql server T-SQL查询以选择时间戳更接近的值

Sql server T-SQL查询以选择时间戳更接近的值,sql-server,tsql,Sql Server,Tsql,我试图根据表a中的ID进行查询,以显示与表p最近的行,该行具有与表a相同的TimestampLocal列ad 我成功地做到了: IF(A.Generated - P.Local) >= 0 THEN select P.Location where P.Local = A.Generated + MIN(A.Generated - P.Local) ELSE select P.Location where P.Local = A.Generated +

我试图根据表a中的ID进行查询,以显示与表p最近的行,该行具有与表a相同的TimestampLocal列ad

我成功地做到了:

 IF(A.Generated - P.Local) >= 0 THEN
       select P.Location where P.Local = A.Generated + MIN(A.Generated - P.Local)
    ELSE
       select P.Location where P.Local = A.Generated + MAX(A.Generated - P.Local)
我试图从表p中得到值

IF (select datediff(second, a.Generated,p.Local) from A a inner join P p on a.VId=p.VId where a.Id = 830566) >=0
select Location from P where Local = dateadd(millisecond,(select Min(datediff(second, a.Generated,p.Local)) from A a inner join P p on a.VId=p.VId where a.Id=830566), 
(select Generated from A where Id=830566))

ELSE

select Location from P where Local =dateadd(second,(select Max(datediff(millisecond, a.Generated,p.Local)) from A a inner join P p on a.VId=p.VId where a.Id=830566), 
(select Generated from A where Id=830566))
但我得到了一个错误:

子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

datediff函数导致溢出。分隔两个日期/时间实例的DatePart数量太多。尝试将datediff与不太精确的datepart一起使用

但我不知道为什么:是否可以根据表A Id从表p中获取最近的行?如果P中有多行具有相同的时间戳,那么只获取第一行

更新

表A:

Id       Generated                            VId
830566 | 2017-06-04 10:38:22.2000000 -07:00 | 5635
830567 | 2017-06-04 10:38:45.1000000 -07:00 | 5634
830568 | 2017-06-04 10:31:59.6000000 -07:00 | 5638
表p:

VId    Local                                Location
5638 | 2017-06-04 10:26:17.9000000 -07:00 | 0xE6
5638 | 2017-06-04 10:31:48.6000000 -07:00 | 0X7F
5638 | 2017-06-04 10:32:48.7000000 -07:00 | 0x3C
5634 | 2017-06-04 10:31:48.6000000 -07:00 | 0xA6

例如:对于作为参数接收的表A中的Id 830568-VId 5638,我应该从表p中获取具有最接近的本地时间和相同VId的最接近的行,在本例中是第二行2017-06-04 10:31:48.6000000-07:00,对于来自p的这一行,我需要获取位置:0X7F。如果您不想超过最接近的时间,那么删除datediff函数周围的ABS并取消对连接条件的注释

declare @TableA table (Id int, [Generated] datetime2, VId int)

declare @TableB table (VId int, [Local] datetime2, [Location] varchar(64))

insert into @TableA
values
(830566,'2017-06-04 10:38:22.2000000 -07:00',5635),
(830567,'2017-06-04 10:38:45.1000000 -07:00',5634),
(830568,'2017-06-04 10:31:59.6000000 -07:00 ',5638)

insert into @TableB values

(5638,'2017-06-04 10:26:17.9000000 -07:00','0xE6'),
(5638,'2017-06-04 10:31:48.6000000 -07:00','0X7F'),
(5638,'2017-06-04 10:32:48.7000000 -07:00','0x3C'),
(5634,'2017-06-04 10:31:48.6000000 -07:00','0xA6')


;with cte as(
select
    a.Id
    ,a.VId
    ,a.Generated
    ,b.Local
    ,b.Location
    ,ABS(DATEDIFF(second,a.Generated,b.Local)) as TD
from 
    @TableA a
inner join 
    @TableB b on
    b.VId = a.VId)
    --and b.local < a.Generated

select
    c.Id
    ,c.VId
    ,c.Location
from 
    cte c
    inner join
        (select ID, min(TD) TD
         from cte
         group by ID) c2 on c2.Id = c.Id and c2.TD = c.TD

你能把一些样本数据作为插入。。。文本的预期值是多少?@etsa我已经完成了必要的updateclosest,但没有超过或最近的周期?如果VId 5638有10:32:00,它应该返回还是仍然是您所说的值呢?如果VId 5438有10:32:00,而不是10:31:59,它应该返回10:32:00,因为这是与表a中的时间最接近的时间。最接近的时间不能是与开始时间最接近的小时和分钟。完美!非常感谢您的回答!:向上的你也是!:再次感谢!如果精度级别发挥作用,可能需要将秒更改为毫秒。只是一个想法。