Introducción
En este laboratorio, explorará las potentes operaciones de fecha y hora de PostgreSQL. Aprenderá a trabajar con marcas de tiempo (timestamps) que incluyen información de zona horaria, una habilidad crucial para aplicaciones que manejan datos de diferentes ubicaciones geográficas.
Comenzará creando una tabla diseñada para almacenar datos de eventos, utilizando el tipo de dato TIMESTAMPTZ para garantizar la conciencia de la zona horaria. Luego insertará datos para eventos que ocurren en diferentes zonas horarias y aprenderá cómo PostgreSQL normaliza estos datos. Finalmente, practicará la consulta y manipulación de estos datos temporales utilizando funciones como EXTRACT, la cláusula AT TIME ZONE y el cálculo de diferencias de tiempo con INTERVAL.
Crear una Tabla para Eventos Basados en Tiempo
En este paso, se conectará a la base de datos PostgreSQL y creará una tabla para almacenar información de eventos. Esta tabla utilizará el tipo de dato TIMESTAMPTZ, que es esencial para almacenar con precisión marcas de tiempo de diversas zonas horarias.
Comprendiendo TIMESTAMPTZ
El tipo de dato TIMESTAMPTZ (timestamp with time zone) en PostgreSQL está diseñado para manejar fechas y horas de todo el mundo. Cuando inserta un valor con una zona horaria específica, PostgreSQL lo convierte a Tiempo Universal Coordinado (UTC) para su almacenamiento. Esta estandarización facilita la comparación y el cálculo de horas independientemente de su zona horaria original.
Paso 1: Conectarse a PostgreSQL
Primero, abra una terminal. Conéctese a la base de datos PostgreSQL utilizando el shell interactivo psql. Ejecutará todos los comandos SQL subsiguientes en este shell.
sudo -u postgres psql
Ahora verá el prompt de PostgreSQL, que se ve así: postgres=#.
Paso 2: Crear la Tabla events
Ahora, ejecute el siguiente comando SQL para crear la tabla events. Esta tabla almacenará un ID, un nombre y una hora para cada evento.
CREATE TABLE events (
id SERIAL PRIMARY KEY,
event_name VARCHAR(255),
event_time TIMESTAMPTZ
);
Este comando crea una tabla llamada events con tres columnas:
id: Una clave primaria auto-incremental.event_name: Un campo de texto para el nombre del evento.event_time: Una marca de tiempo con soporte para zona horaria.
Paso 3: Verificar la Creación de la Tabla
Para confirmar que la tabla se creó correctamente, puede inspeccionar su estructura con el comando \d.
\d events
Debería ver el esquema de la tabla events, confirmando sus columnas y tipos de datos.
Table "public.events"
Column | Type | Collation | Nullable | Default
------------+------------------------+-----------+----------+-----------------------------------
id | integer | | not null | nextval('events_id_seq'::regclass)
event_name | character varying(255) | | |
event_time | timestamp with time zone | | |
Indexes:
"events_pkey" PRIMARY KEY, btree (id)
Ha configurado con éxito la tabla para almacenar datos basados en el tiempo.
Insertar Datos con Información de Zona Horaria
En este paso, insertará registros en la tabla events. Cada registro tendrá una marca de tiempo asociada a una zona horaria específica, demostrando cómo PostgreSQL maneja datos de diferentes ubicaciones geográficas.
Paso 1: Insertar Datos de Eventos
Mientras se encuentra en el shell psql, ejecute las siguientes sentencias INSERT para agregar tres eventos a su tabla. Observe cómo cada event_time incluye un identificador de zona horaria.
Inserte una llamada de conferencia desde Los Ángeles (UTC-8):
INSERT INTO events (event_name, event_time) VALUES
('Conference Call', '2024-01-20 10:00:00 America/Los_Angeles');
Inserte una reunión de proyecto desde Londres (UTC+0):
INSERT INTO events (event_name, event_time) VALUES
('Project Meeting', '2024-01-20 18:00:00 Europe/London');
Inserte una reunión de seguimiento, también desde Los Ángeles:
INSERT INTO events (event_name, event_time) VALUES
('Follow-up Meeting', '2024-01-21 12:00:00 America/Los_Angeles');
Paso 2: Verificar la Inserción de Datos
Para ver cómo PostgreSQL almacenó estos datos, consulte la tabla events.
SELECT * FROM events;
Debería ver la siguiente salida.
id | event_name | event_time
----+-------------------+------------------------
1 | Conference Call | 2024-01-20 18:00:00+00
2 | Project Meeting | 2024-01-20 18:00:00+00
3 | Follow-up Meeting | 2024-01-21 20:00:00+00
(3 rows)
Observe que todos los valores de event_time se muestran en UTC (indicado por el desplazamiento +00). Por ejemplo, las 10:00:00 en Los Ángeles (UTC-8) se convirtieron a 18:00:00 UTC. Esta conversión interna es lo que permite comparaciones consistentes basadas en el tiempo.
Consultar y Formatear Marcas de Tiempo
Ahora que tiene datos almacenados en UTC, puede consultarlos y mostrarlos en cualquier zona horaria que necesite. En este paso, utilizará la función EXTRACT y la cláusula AT TIME ZONE para manipular y formatear sus marcas de tiempo.
Paso 1: Extraer Partes de una Marca de Tiempo con EXTRACT
La función EXTRACT le permite extraer componentes específicos (como año, mes, hora) de una marca de tiempo. Obtengamos el año de cada evento.
SELECT event_name, EXTRACT(YEAR FROM event_time) AS event_year FROM events;
La consulta extrae el año de la marca de tiempo UTC almacenada.
event_name | event_year
-------------------+------------
Conference Call | 2024
Project Meeting | 2024
Follow-up Meeting | 2024
(3 rows)
Paso 2: Convertir Marcas de Tiempo con AT TIME ZONE
Para ver la hora UTC almacenada en una zona horaria local específica, utilice la cláusula AT TIME ZONE. Convirtamos todas las horas de los eventos de nuevo a la zona horaria America/Los_Angeles.
SELECT event_name, event_time AT TIME ZONE 'America/Los_Angeles' AS los_angeles_time FROM events;
Esta consulta toma la event_time UTC y muestra su hora local equivalente en Los Ángeles.
event_name | los_angeles_time
-------------------+---------------------
Conference Call | 2024-01-20 10:00:00
Project Meeting | 2024-01-20 10:00:00
Follow-up Meeting | 2024-01-21 12:00:00
(3 rows)
Como puede ver, la 'Project Meeting' que ocurrió a las 18:00:00 UTC se muestra correctamente como 10:00:00 en la hora de Los Ángeles.
Paso 3: Combinar EXTRACT y AT TIME ZONE
Puede combinar estas características para consultas más potentes. Por ejemplo, para encontrar la hora de cada evento tal como ocurrió en la zona horaria Europe/London:
SELECT event_name, EXTRACT(HOUR FROM event_time AT TIME ZONE 'Europe/London') AS event_hour_london FROM events;
Esta consulta primero convierte la hora a la zona horaria de Londres y luego extrae la hora.
event_name | event_hour_london
-------------------+-------------------
Conference Call | 18
Project Meeting | 18
Follow-up Meeting | 20
(3 rows)
Calcular Diferencias de Tiempo
Un requisito común es calcular la duración entre dos eventos. En PostgreSQL, restar una marca de tiempo de otra da como resultado un tipo de dato INTERVAL, que representa una duración de tiempo.
Paso 1: Calcular la Diferencia Entre Dos Eventos
Calculemos el tiempo transcurrido entre la 'Conference Call' y la 'Follow-up Meeting'. Podemos lograr esto uniendo la tabla events consigo misma.
SELECT
e1.event_name AS event1,
e2.event_name AS event2,
e2.event_time - e1.event_time AS time_difference
FROM
events e1
JOIN
events e2 ON e1.event_name = 'Conference Call' AND e2.event_name = 'Follow-up Meeting';
Esta consulta funciona de la siguiente manera:
- Crea dos instancias virtuales de la tabla
events,e1ye2. - Filtra
e1para incluir solo la fila 'Conference Call'. - Filtra
e2para incluir solo la fila 'Follow-up Meeting'. - Resta la
event_timedee1de la dee2.
El resultado es un valor INTERVAL.
event1 | event2 | time_difference
-----------------+-------------------+-----------------
Conference Call | Follow-up Meeting | 1 day 02:00:00
(1 row)
La diferencia de tiempo es de 1 día y 2 horas.
Paso 2: Extraer Componentes de un INTERVAL
También puede usar EXTRACT en un INTERVAL para obtener partes específicas de la duración, como el número de días u horas. Extraigamos solo el número de días del cálculo anterior.
SELECT
EXTRACT(DAY FROM (e2.event_time - e1.event_time)) AS days_difference
FROM
events e1
JOIN
events e2 ON e1.event_name = 'Conference Call' AND e2.event_name = 'Follow-up Meeting';
Esto le da un valor numérico para los días.
days_difference
-----------------
1
(1 row)
Paso 3: Salir de PostgreSQL
Ha completado los ejercicios de este laboratorio. Ahora puede salir del shell psql y regresar a la terminal principal.
\q
Resumen
En este laboratorio, ha explorado operaciones esenciales de fecha y hora en PostgreSQL. Ha aprendido a:
- Crear una tabla utilizando el tipo de dato
TIMESTAMPTZpara almacenar correctamente información consciente de la zona horaria. - Insertar marcas de tiempo con zonas horarias especificadas y observar cómo PostgreSQL las convierte a UTC para su almacenamiento.
- Utilizar la función
EXTRACTpara recuperar componentes específicos como el año o la hora de una marca de tiempo. - Utilizar la cláusula
AT TIME ZONEpara mostrar las horas UTC almacenadas en cualquier zona horaria local deseada. - Calcular la duración entre dos eventos, lo que resulta en un
INTERVAL, y extraer componentes de ese intervalo.
Estas habilidades son fundamentales para construir aplicaciones robustas que gestionen datos temporales con precisión en diferentes regiones.


