Zonas horarias: TIMESTAMP frente a TIMESTAMPTZ
Comprenda la diferencia entre TIMESTAMP y TIMESTAMPTZ, convierta con AT TIME ZONE y almacene la hora en UTC para crear aplicaciones portables.
Zonas horarias: TIMESTAMP frente a TIMESTAMPTZ es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Dos tipos de marcas de tiempo
PostgreSQL tiene DOS tipos de marcas de tiempo:
TIMESTAMP— marca de tiempo "ingenua", sin información de zona horariaTIMESTAMPTZ— marca de tiempo con zona horaria (se almacena internamente como UTC)
Regla práctica: prefiera TIMESTAMPTZ para eventos; use TIMESTAMP para horas puramente abstractas, como "las 9:00 en el horario comercial".
Cómo funciona TIMESTAMPTZ
Internamente, siempre se almacena como UTC. Al hacer INSERT, la entrada se convierte de la zona horaria de la sesión a UTC. Al hacer SELECT, la salida vuelve a convertirse a la zona horaria de la sesión.
SET TIME ZONE 'Europe/Berlin';
INSERT INTO events (ts) VALUES ('2024-03-15 12:00:00');
-- stored as 2024-03-15 11:00:00 UTC (Berlin is UTC+1 in winter)
SET TIME ZONE 'UTC';
SELECT ts FROM events;
-- 2024-03-15 11:00:00+00TIMESTAMP pierde información
Un TIMESTAMP simple no conoce la zona horaria. "2024-03-15 12:00:00" podría representar cualquier hora local. Cuando los usuarios cambian de zona, se pierde el significado.
AT TIME ZONE
Convierta entre zonas para mostrar los datos:
SELECT ts AT TIME ZONE 'America/New_York' AS ny_time FROM events;
SELECT ts AT TIME ZONE 'Asia/Tokyo' AS tokyo_time FROM events;Almacenar en UTC y mostrar en hora local
Práctica recomendada: almacene TIMESTAMPTZ, conviértalo a la zona del usuario en el SELECT y nunca al contrario.
SELECT id,
ts AT TIME ZONE COALESCE(u.tz, 'UTC') AS local_ts
FROM events e
JOIN users u ON u.id = e.user_id;SESSION TIME ZONE
Puede establecerla por sesión, por usuario o de forma global:
-- Session:
SET TIME ZONE 'Europe/Berlin';
-- Per-user (PG):
ALTER ROLE alice SET timezone TO 'Europe/Berlin';
-- Server default in postgresql.conf:
-- timezone = 'UTC'INDICAR LA ZONA EN EL LITERAL
Incluya una zona en el literal:
SELECT TIMESTAMPTZ '2024-03-15 12:00:00 Europe/Berlin';
SELECT '2024-03-15 12:00:00+02'::TIMESTAMPTZ;NOW() devuelve TIMESTAMPTZ
NOW() y CURRENT_TIMESTAMP siempre devuelven TIMESTAMPTZ. Mezclarlos con columnas TIMESTAMP es un error habitual.
Cuándo es adecuado TIMESTAMP (sin zona)
Para horas abstractas o locales que realmente no dependen de una zona —como "la tienda abre a las 09:00"— use TIMESTAMP (o TIME).
CREATE TABLE store_hours (
store_id BIGINT,
open_at TIME NOT NULL,
close_at TIME NOT NULL
);Transiciones del horario de verano
TIMESTAMPTZ gestiona automáticamente el horario de verano. Añadir INTERVAL funciona en horas del reloj salvo que atraviese el cambio de horario; en ese caso, puede desplazarse 23 o 25 horas.
SELECT TIMESTAMPTZ '2024-03-30 23:00:00 Europe/Berlin' + INTERVAL '5 hours';
-- Result accounts for the DST transition on March 31No almacene desplazamientos; almacene nombres de zonas
Un desplazamiento como +02:00 no indica cuándo comienza el horario de verano. Un nombre de zona como Europe/Berlin sí. Cuando almacene la zona de residencia de un usuario, guarde el nombre de IANA.
Repaso
Use TIMESTAMPTZ de forma predeterminada para los eventos.
- Se almacena como UTC y se muestra en la zona horaria de la sesión
- Convierta los datos para mostrarlos con AT TIME ZONE
- Use TIMESTAMP (sin zona) solo para horas locales abstractas
Comprobación rápida
Está creando un SaaS global que registra eventos de usuarios. ¿Qué tipo de marca de tiempo debería usar para la columna occurred_at?
Aprende SQL con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 46
- Lecciones
- 183
Preguntas frecuentes
¿La lección «Zonas horarias: TIMESTAMP frente a TIMESTAMPTZ» es gratis?
Sí — el texto completo de «Zonas horarias: TIMESTAMP frente a TIMESTAMPTZ» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Zonas horarias: TIMESTAMP frente a TIMESTAMPTZ»?
Comprenda la diferencia entre TIMESTAMP y TIMESTAMPTZ, convierta con AT TIME ZONE y almacene la hora en UTC para crear aplicaciones portables. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Zonas horarias: TIMESTAMP frente a TIMESTAMPTZ»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Aritmética de fechas e INTERVAL
- EXTRACT, DATE_TRUNC y AGE
- Zonas horarias: TIMESTAMP frente a TIMESTAMPTZ
- Informes habituales de fechas (MTD, WoW, YoY)