Загружаем изображение…
Диапазоны как тип данных: убираем двойные условия и баги!
Когда работаешь с интервалами, обычно пишут два условия, и почти всегда где-то ошибаются с границами:
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 | #совет