CodeGym /Cursos /SQL SELF /Tipos de datos para trabajar con fechas y horas: D...

Tipos de datos para trabajar con fechas y horas: DATE, TIME, TIMESTAMP, TIMESTAMPTZ

SQL SELF
Nivel 31 , Lección 0
Disponible

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.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION