A TIMESTAMP column is a labeled clock face, not a moment — the same value means different instants in different zones, and on two days a year the label misbehaves: spring-forward has a hole (02:30 never occurs), fall-back a fold (one label, two instants). Durations on naive local times inherit both: the night of spring-forward is 23 wall-clock hours. Instants in UTC in storage; zones only at the edges; durations on instants.
SELECT guest, CAST(date_diff('minute', in_utc AT TIME ZONE 'America/New_York', out_utc AT TIME ZONE 'America/New_York' ) AS INT) AS mins FROM soaks;
SELECT guest, CAST(date_diff('minute', in_utc, out_utc) AS INT) AS mins FROM soaks;
The soak session read 90 minutes, not 30 — subtracting two naive local wall-clock times across the spring-forward night counts the skipped 02:00 hour; computing on UTC instants gives the true duration.
Instants in UTC (timestamptz) in storage; zones applied only at display/input edges; durations computed on instants, never on labels.
timestamptz behavior and session-zone semantics vary; the nonexistent/ambiguous hours are universal.