The primary distinction lies in how these types interact with time zones during storage and retrieval.
Here’s the code that breaks production:
If your column is TIMESTAMPTZ , but your application sends a naive timestamp, PostgreSQL will assume the timestamp is in your session's time zone. If your server is in UTC and your user is in Sydney – .
| Column | What PostgreSQL stores internally | |--------|----------------------------------| | ts_native | 2025-04-14 14:00:00 (exact text, no zone info) | | ts_tz | A UTC timestamp: 2025-04-14 18:00:00+00 (because 2pm ET = 6pm UTC) |
For 95% of applications, TIMESTAMPTZ is the correct choice. Its primary advantage is .