У меня есть некоторые данные в серии баз данных 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);
Но я не уверен, как получить периоды времени а, где она не имеет соответствия б. Это легко получить записи в которой нет перекрытия:
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;
Но о том, где они пересекаются, или б разбивает на две записи? Показаны диапазоны дат, как сроки, как я получаю c
в a-b=c
зависимости, показанной ниже (строки представляют собой диапазоны дат отдельных записей в таблицах a
и b
, и результирующий набор c
)
a: |-----------------| |--------| |--------||-----|
b: |---| |--------|
c: |-----| |-----| |-----| |---||-----|
Или лучше но есть ли какая-то библиотека, расширение, команда, о которой я не знаю, или другое решение, которое можно использовать для упрощения этих запросов? Что-то, что может обрабатывать беспорядочные операции с диапазоном дат для меня?
попробовали что-то вроде этого: WHERE condition BETWEEN lower_range AND upper_range –
[SQL: 2011] (http://en.wikipedia.org/wiki/SQL:2011) выглядит многообещающим. Может быть, мне просто нужно очистить свой C и добавить некоторые из этих функций в SQLite самостоятельно. – AndASM