考虑由一个主键和两个描述开始日期和结束日期的属性组成的DynamoDB表。如何在不扫描整个表的情况下查询某个时间范围是否与表中的时间范围重叠?
例:发电机表有两条记录
PK Start End
A 2019-01-01 2019-10-01
B 2019-06-01 2019-08-01
查询中记录的时间范围为2018-02-01至2019-03-01。
我在一系列包含各种相关表的SQLite数据库中获得了一些数据。SQLite数据库主要是使用C#和System.Data.SQLite库访问的。
我希望能够查询日期范围重叠或不重叠的连接。我发现在重叠的地方连接数据非常简单:
SELECT a.field, max(a.start, b.start) as start, min(a.end, b.end) as end
FROM a
INNER JOIN b
ON a.field = b.field AND NOT(a.start > b.end OR b.start > a.end);
但我不确定如何获得a的时间段,如果a没有匹配的
我有以下查询,它将检索作为参数提供的开始日期和结束日期之间的事件:
SELECT * FROM events
WHERE (startDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME)
OR endDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME))
这可以很好地检索重叠开始和结束时间的事件,但不会获取在这两个时间之间完全封装的事件。一张图片可能会让这一点变得更清楚:
Event A |---------------------------