Sql 基于datetime2谓词的表连接

Sql 基于datetime2谓词的表连接,sql,sql-server,tsql,join,datetime2,Sql,Sql Server,Tsql,Join,Datetime2,我如何连接TripID上的表A和表B(见图),以及时间触发在分段开始和分段结束之间的位置 我可以试试: FROM TableA A INNER JOIN TableB B ON A.TripID = B.TripID AND B.TimeTriggered BETWEEN A.SegmentStart AND A.SegmentEnd 但是,由于两端都包含中间,因此它会将报警B连接到段1和段2 我可以尝试>=和和您可以使用应用任意选择其中一个: SELECT . . . FROM Table

我如何连接TripID上的表A和表B(见图),以及时间触发在分段开始和分段结束之间的位置

我可以试试:

FROM TableA A
INNER JOIN TableB B
ON A.TripID = B.TripID
AND B.TimeTriggered BETWEEN A.SegmentStart AND A.SegmentEnd
但是,由于两端都包含中间,因此它会将报警B连接到段1和段2


我可以尝试>=和<,但它会忽略报警C。我可以尝试>和您可以使用
应用
任意选择其中一个:

SELECT . . . 
FROM TableA A CROSS APPLY
     (SELECT TOP (1) B.*
      FROM TableB B
      WHERE A.TripID = B.TripID AND
            B.TimeTriggered BETWEEN A.SegmentStart AND A.SegmentEnd
     ) B;

但是,您应该修复数据。通常情况下,对于日期时间值和范围,第一个值是范围的一部分,第二个不是。

似乎您想要
=
所以alram B应该与每个段一起使用,为什么?或者您不介意。然而,正如Larnu提到的,您的数据不正确,最好的解决方案是按照问题指南修复您的数据,请不要发布代码、数据、错误消息等的图像-将文本复制或键入问题中。请保留图像用于图表或演示渲染错误,这是无法通过文本准确描述的。我不确定我是否理解如何修复数据。不幸的是,由于表B中没有可显式连接的SegmentID,因此无法确定报警B应属于段1还是段2。如果我使用>=和<,则报警C将不会与任何段匹配。@thesnowplow。问题是开始和结束时间。你应该有一个结构,区间的结尾不是区间的一部分。我想我太密集了,无法理解这一点。一段的结束时间是下一段的开始时间。你的意思是,情况不应该是这样,在一段结束和下一段开始之间应该有一个小的单位增量?@TheSwowPlow。确切地这就是重点。段的结束时间不应是该段的一部分。它应该与下一段相关。顺便说一句,我刚刚意识到你的名字似乎很熟悉。。看看我的书架,它就在我几年前买的《使用SQL和Excel进行数据分析》(Seconds Edition)的副本上。神奇的东西。。谢谢!