Cuando trabajas con datos, casi siempre sale algo relacionado con el tiempo. Piensa en horarios de vuelos, fechas límite de pedidos o la fecha en la que un usuario se registró en la web. Todo eso va de tiempo. Y para manejarlo bien, necesitas las herramientas adecuadas. En PostgreSQL tienes tipos de datos especiales que van genial para guardar y procesar fechas y horas.
Puedes, claro, guardar una fecha como un string normal tipo "2023-10-12", pero eso es más una trampa que una solución. Los strings no saben comparar fechas, no entienden qué es “más tres días” y ni idea de los husos horarios. Pero los tipos de datos temporales sí que lo saben todo eso y más. Con ellos es más fácil, más seguro y más rápido.
Tipo DATE
El tipo DATE se usa para guardar solo la fecha del calendario, sin la hora concreta. Es útil si necesitas trabajar con fechas como entidades independientes, por ejemplo, fecha de nacimiento, inicio de año y cosas así.
Ejemplos de uso:
-- Ejemplo de crear una tabla con el tipo `DATE`
CREATE TABLE events (
event_name TEXT,
event_date DATE
);
-- Insertar datos
INSERT INTO events (event_name, event_date)
VALUES ('Conferencia PostgreSQL', '2023-12-01'),
('Cumpleaños', '2023-10-12');
-- Consulta de selección
SELECT * FROM events;
Resultado:
| event_name | event_date |
|---|---|
| Conferencia PostgreSQL | 2023-12-01 |
| Cumpleaños | 2023-10-12 |
Tipo TIME
El tipo TIME guarda SOLO la hora, es decir, horas, minutos y segundos. Es perfecto para cosas como horarios, por ejemplo, horarios de autobuses o intervalos de apertura de tiendas.
Ejemplos:
-- Ejemplo de crear una tabla con `TIME`
CREATE TABLE schedules (
schedule_name TEXT,
start_time TIME,
end_time TIME
);
-- Insertar datos
INSERT INTO schedules (schedule_name, start_time, end_time)
VALUES ('Horario laboral', '09:00:00', '18:00:00'),
('Pausa para comer', '13:00:00', '14:00:00');
-- Consulta de selección
SELECT schedule_name, start_time, end_time FROM schedules;
Resultado:
| schedule_name | start_time | end_time |
|---|---|---|
| Horario laboral | 09:00:00 | 18:00:00 |
| Pausa para comer | 13:00:00 | 14:00:00 |
Tipo TIMESTAMP
El tipo TIMESTAMP junta la fecha del calendario y la hora en un solo valor. Pero OJO, NO tiene en cuenta los husos horarios. Esto puede liar un poco si los datos los usan personas de diferentes zonas horarias.
Ejemplos:
-- Ejemplo de crear una tabla con `TIMESTAMP`
CREATE TABLE documents (
document_id SERIAL PRIMARY KEY,
created_at TIMESTAMP
);
-- Insertar datos
INSERT INTO documents (created_at)
VALUES ('2023-10-12 15:30:00'),
('2023-12-01 08:45:15');
-- Consulta de selección
SELECT document_id, created_at FROM documents;
Resultado:
| document_id | created_at |
|---|---|
| 1 | 2023-10-12 15:30:00 |
| 2 | 2023-12-01 08:45:15 |
Tipo TIMESTAMPTZ
El tipo TIMESTAMPTZ (donde TZ significa "zona horaria") es parecido a TIMESTAMP, pero además guarda la info de la zona horaria. Esto lo hace imprescindible para apps que tienen usuarios de todo el mundo.
Ejemplos:
-- Ejemplo de crear una tabla con `TIMESTAMPTZ`
CREATE TABLE meetings (
meeting_id SERIAL PRIMARY KEY,
meeting_time TIMESTAMPTZ
);
-- Insertar datos (PostgreSQL guarda la zona horaria actual)
INSERT INTO meetings (meeting_time)
VALUES ('2023-10-12 15:30:00+03'),
('2023-12-01 08:45:15-05');
-- Consulta de selección
SELECT meeting_id, meeting_time FROM meetings;
Resultado:
| meeting_id | meeting_time |
|---|---|
| 1 | 2023-10-12 15:30:00+03:00 |
| 2 | 2023-12-01 08:45:15-05:00 |
Ojo, PostgreSQL convierte automáticamente la hora a la zona horaria del servidor.
Ventajas de usar tipos de datos especializados
Datos correctos. Tipos como DATE y TIMESTAMP evitan que metas datos incorrectos. Por ejemplo, no puedes poner una fecha que no existe, como "2023-02-30".
Comodidad. Puedes comparar fechas, restarlas, sacar la fecha actual e incluso redondear valores (de eso hablaremos más adelante).
Rendimiento. Los tipos temporales ocupan menos espacio en memoria y en los índices que los strings, así que las consultas van más rápido.
Ejemplo: crear una tabla usando todos los tipos
Vamos a crear una tabla más compleja para guardar el horario de eventos. Usaremos varios tipos a la vez: DATE, TIME, TIMESTAMP y TIMESTAMPTZ.
CREATE TABLE event_schedule (
event_id SERIAL PRIMARY KEY,
event_name TEXT NOT NULL,
event_date DATE NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
full_start TIMESTAMP NOT NULL,
full_start_with_zone TIMESTAMPTZ NOT NULL
);
-- Insertamos datos
INSERT INTO event_schedule (
event_name, event_date, start_time, end_time, full_start, full_start_with_zone
)
VALUES
('Meetup matutino', '2023-11-10', '10:00:00', '11:30:00', '2023-11-10 10:00:00', '2023-11-10 10:00:00+03'),
('Workshop vespertino', '2023-11-11', '18:00:00', '20:00:00', '2023-11-11 18:00:00', '2023-11-11 18:00:00+03');
-- Comprobamos los datos
SELECT * FROM event_schedule;
Resultado:
| event_id | event_name | event_date | start_time | end_time | full_start | fullstartwith_zone |
|---|---|---|---|---|---|---|
| 1 | Meetup matutino | 2023-11-10 | 10:00:00 | 11:30:00 | 2023-11-10 10:00:00 | 2023-11-10 10:00:00+03:00 |
| 2 | Workshop vespertino | 2023-11-11 | 18:00:00 | 20:00:00 | 2023-11-11 18:00:00 | 2023-11-11 18:00:00+03:00 |
Este es un ejemplo real de una base de datos para gestionar horarios. Ves cómo los diferentes formatos de datos temporales se complementan según la tarea.
Espero que te acuerdes de cómo usar los tipos DATE, TIME, TIMESTAMP y TIMESTAMPTZ en PostgreSQL. En las siguientes lecciones vamos a profundizar en las funciones temporales y aprenderemos a extraer, formatear y manejar datos temporales con consultas SQL.
GO TO FULL VERSION