Я предполагаю, что вы хотите определить, перекрывается ли одно вновь вставленное (или обновленное) событие ( не , есть ли какое-либо из событий, уже находящихся в базе данных, имеет перекрытия), верно?
Если это так, вы можете процедурно (на вашем клиентском языке) сгенерировать все интервалы начала / окончания [s, e]
на основе вновь вставленного события «Тип повторения», а затем выполнить следующий запрос для каждого из этих интервалов, чтобы обнаружить перекрытия ( Я использую синтаксис Oracle здесь, я предполагаю, что SQLite похож):
-- A time interval must be either completely "to the left" or completely
-- "to the right" of the other time interval for them not to overlap.
SELECT * FROM EVENT
WHERE
NOT(
(:s < DTSTART AND :s < DTEND AND :e < DTSTART AND :e < DTEND)
OR (:s > DTSTART AND :s > DTEND AND :e > DTSTART AND :e > DTEND)
)
Не ожидайте звездной производительности (особенно, если ваше событие имеет большое количество повторений или если DTSTART / DTEND не проиндексированы, или SQLite не может должным образом использовать этот индекс).
Для повышения производительности вам, вероятно, будет лучше кэшировать все события в памяти и выполнять всю обработку на стороне клиента, что позволит вам более легко использовать эвристику для «короткого замыкания» некоторой обработки. Например:
- Если два события имеют один и тот же «тип повтора», вы можете просто сравнить их начальные интервалы, не беспокоясь о повторениях - если они не совпадают изначально, они никогда не будут совпадать.
- Если «последнее вхождение» одного события раньше, чем другое, даже не «dtstart», они никогда не могут совпадать независимо от «повторного типа».
- Etc ...
Если вы действительно хотите, чтобы вся ваша обработка на стороне базы данных и требовала производительности (запроса), вы, вероятно, смотрите на какую-то геопространственную / многомерную индексацию и вам нужно будет на самом деле сохранить событие повторения в базе данных, чтобы их можно было проиндексировать, что, вероятно, снизит производительность вставки. Я не знаком с SQLite и с тем, поддерживает ли он такой вид индексации ...