Когда работаешь с интервалами, обычно пишут два условия, и почти всегда где-то ошибаются с границами:
WHERE created_at <= now()
AND shipped_at > now()
Такой код легко сломать и плохо масштабируется:
tstzrange(created_at, shipped_at)
PostgreSQL имеет встроенные range-типы, которые позволяют хранить и сравнивать интервалы как единое значение.
tstzrange — для timestamptz, tsrange — для timestamp:
@> now()
Оператор
@> проверяет содержит ли диапазон значение, заменяя сразу два условия.По умолчанию границы [ ) — аналог
created_at <= x AND shipped_at > x:CREATE INDEX ON orders USING GIST (tstzrange(created_at, shipped_at));
С
GiST-индексом такие запросы работают эффективно даже на больших объёмах.🔥
range-типы — это способ убрать класс ошибок с датами и упростить сложную логику.➡️ SQL Ready | #совет
