Если в PostgreSQL группировать платежи по дате через paid_at::date, результат зависит от часового пояса текущей сессии. Один и тот же запрос из двух подключений с разными настройками может разнести платежи по разным дням, хотя общая сумма останется прежней.
Пример: платёж прошёл 10 ноября 2026 года в 23:30 UTC. В отчёте по UTC его сумма попадёт в 10 ноября, а в поясе UTC+7 это уже 11 ноября, 06:30. В демонстрации с тремя успешными платежами отчёт по UTC показал одну строку за 10 ноября с суммой 600 ₽, а после переключения сессии на ‘Asia/Krasnoyarsk’ за 10 ноября осталось 100 ₽ и за 11 ноября появилось 500 ₽.
Чтобы даты не зависели от настроек сессии, часовой пояс задают явно до группировки. Конструкция AT TIME ZONE переводит момент платежа в местное время выбранного пояса, а приведение к date берёт его календарную дату.
То же правило используют в фильтре периода: нижнюю границу включают, верхнюю исключают, а обе полуночи задают в часовом поясе отчёта. Так платёж ровно в полночь попадёт в один день, и это пригодится для поясов с переводом часов, где календарные сутки могут отличаться от 24 часов.
Расхождения сохранятся, если в одном отчёте взять время платежа, а в другом время получения webhook. Для сверки нужны одинаковые событие, часовой пояс и границы периода, а эти условия желательно выводить рядом с датой выгрузки.