Из опыта: если у вас есть такая возможность, переопределите end_date
.В вашем примере end_date
- 31 декабря, а следующее start_date
- 1 января.Две разные даты, которые на самом деле означают одно и то же : не продолжался первый цикл размещения договора с клиентом вплоть до всего 31 декабря, поэтомувплоть до 1-го января?
При определении периодов с использованием start
+ end
это значительно упрощает вычисления и фильтры, если вы определите end_date
как сразу после фактический конец.Иногда используется запись [start_date, end_date[
: end_date
- это , а не , включенные в период.
Как только ваши данные настроены таким образом, вы можете просто сделать where previous.end_date = next.start_date
.Это также позволяет вам использовать простые индексы (вместо индекса, основанного на функции end_date+1
).
Альтернативой может быть изучение типа данных Interval .По определению он определяет отрезок времени: используйте start_date
-поле и duration
-поле вместо start_date, end_date
.Вычитание дат, например next.start_date - previous.start_date
, возвращает интервал, так что вы можете, например, фильтровать по next.start_date-previous.start_date <= prevous.duration
.
Что я хочу научить вас, так это то, что моделирование ваших данных по-другому может впоследствии значительно упростить программирование,