Короткий ответ
В PostgreSQL выражение first_order_date - registration_date для двух значений типа date возвращает целое число дней. Для timestamp вычитание возвращает интервал с днями, часами и минутами.
Как это работает подробнее
Приведение временных меток к date отбрасывает время суток и измеряет разницу календарных дат. Если нужны полные двадцатичетырёхчасовые интервалы, вычисляйте длительность из временных меток, а не просто вычитайте даты.
Синтаксис зависит от платформы: BigQuery предлагает DATE_DIFF(first_order_date, registration_date, DAY), ClickHouse — dateDiff('day', registration_date, first_order_date).
Пример кода
query.sql
SELECT
customer_id,
first_order_date - registration_date AS days_to_first_order
FROM customer_first_order
WHERE first_order_date IS NOT NULL;Что использовать на практике
- Сначала найдите первую покупку. Если исходная таблица содержит все заказы, вычислите
MIN(order_date)по клиенту. - Контролируйте качество. Отдельно исследуйте отрицательные значения и клиентов без заказов.
Подводные камни
- Часовые пояса. Разные зоны способны изменить календарную дату события.
- NULL. Клиент без первого заказа получит
NULLв разнице, а не ноль.