Contexto
Migração MySQL → PostgreSQL herdou colunas timestamp (sem timezone).
Em 2026-05-20, APP_TIMEZONE mudou de
America/Sao_Paulo para
UTC.
77 colunas com dados em duas eras:
~3 anos em horário SP + ~2 semanas em UTC.
Bug de ±3h no display de datas
(ex: check-in numérico quebrado, commit e9e61fd8).
c35082eaEstratégia — Opção D
Interpretar tudo como São Paulo, depois corrigir a janela pós-switch. UPDATE em ~2 semanas de dados (não em ~3 anos).
ALTER COLUMN col TYPE timestamptz
USING col AT TIME ZONE
'America/Sao_Paulo'
✗ Pós-switch: +3h off
UPDATE t SET col =
col - interval '3 hours'
WHERE col >= CUTOFF
Categorias de Colunas
Bulk das colunas. Preenchidas por now(),
timestamps(),
softDeletes().
Requer 2 steps.
fixScope: 'row' — WHERE created_at >= CUTOFF
Dados vindos da API do Discord. Sempre foram UTC independente de APP_TIMEZONE.
Tabelas criadas após o switch. Só contêm dados em UTC.
Colunas que já usam timestamptz. Idempotência pula automaticamente.
Artefatos Criados
Converte colunas de timestamp para
timestamptz
usando AT TIME ZONE.
Checa information_schema antes de alterar.
Corrige dados pós-switch subtraindo 3h. Progress display com Laravel Prompts, timing por coluna, summary table.
Módulos — Breakdown
| Módulo | Tabelas | Colunas | Rows Fix | ALTER |
|---|---|---|---|---|
| identity | 7 | 18 | 2,071 | ~2s |
| activity | 12 | 30 | 38,156 | ~58s |
| gamification | 6 | 14 | 960 | ~0.3s |
| integration-discord | 7 | 18 | 149,084 | ~3s |
| integration-twitch | 2 | 4 | — | ~0.04s |
| community | 5 | 14 | 0 | ~0.08s |
| economy | 2 | 4 | 0 | ~0.03s |
| profile | 1 | 2 | — | ~0.04s |
| main | 5 | 11 | 34 | ~0.08s |
| TOTAL | 47 | 115 | 190,305 | ~65s |
Procedimento de Produção
Validação
timestamp without time zone restantesCommits
4abdd632
71bf97b8
8a74bce9
b50351e8
Ajustes Extras
provider_tokens — tabela dropada em migration anteriortmi_cluster_* — 3 tabelas órfãs (pacote removido)Review.received_at — cast 'timestamp' → 'datetime'05-timezone-aware-dates para LLM agents