我在一系列带有各种相关表的 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);
但我不确定如何获得没有匹配 b 的 a 的时间段。在没有重叠的地方很容易获得记录:
SELECT a.field, a.start, a.end
FROM a
LEFT JOIN b
ON a.field = b.field AND NOT(a.start > b.end OR b.start > a.end)
WHERE b.field is NULL;
但是它们在哪里重叠,或者 b 将 a 分成两个记录呢?将日期范围显示为时间线,我如何获得如下所示c
的关系(这些线表示表和中的各个记录的日期范围,以及结果集)a-b=c
a
b
c
a: |-----------------| |--------| |--------||-----|
b: |---| |--------|
c: |-----| |-----| |-----| |---||-----|
或者更好的是,是否有一些我不知道的库、扩展、命令或其他可用于简化这些查询的解决方案?可以为我处理混乱的日期范围操作的东西吗?