関連するさまざまなテーブルを含む一連の 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 を 2 つのレコードに分割する場所はどうでしょうか? c
日付範囲をタイムラインとして表示し、以下に示す関係を取得するにはどうすればよいですかa-b=c
(線は、テーブル内の個々のレコードの日付範囲を表し、a
結果b
セットc
)
a: |-----------------| |--------| |--------||-----|
b: |---| |--------|
c: |-----| |-----| |-----| |---||-----|
または、さらに良いことに、これらのクエリを簡素化するために使用できる、私が知らないライブラリ、拡張機能、コマンド、またはその他のソリューションはありますか? 面倒な日付範囲操作を処理できるものはありますか?