CodeGym /Corsi /SQL SELF /Tipi di dati per lavorare con tempo e date: DATE

Tipi di dati per lavorare con tempo e date: DATE, TIME, TIMESTAMP, TIMESTAMPTZ

SQL SELF
Livello 31 , Lezione 0
Disponibile

Quando si lavora con i dati, quasi sempre salta fuori qualcosa che riguarda il tempo. Pensa agli orari dei voli, alle scadenze degli ordini o alla data in cui un utente si è registrato sul sito. Tutto questo riguarda il tempo. E per lavorarci bene, servono gli strumenti giusti. In PostgreSQL ci sono tipi di dati speciali che sono perfetti per salvare e gestire date e orari.

Certo, potresti salvare una data come una semplice stringa tipo "2023-10-12", ma questa è più una trappola che una soluzione. Le stringhe non sanno confrontare le date, non sanno cosa vuol dire “più tre giorni” e non hanno idea dei fusi orari. I tipi temporali invece sì, e anche di più. Con loro è tutto più semplice, affidabile e veloce.

Tipo DATE

Il tipo DATE serve per salvare solo la data del calendario, senza l’ora precisa. È comodo se ti serve lavorare con le date come entità indipendenti, tipo la data di nascita, l’inizio dell’anno e così via.

Esempi d’uso:

-- Esempio di creazione tabella con tipo `DATE`
CREATE TABLE events (
    event_name TEXT,
    event_date DATE
);

-- Inserimento dati
INSERT INTO events (event_name, event_date)
VALUES ('Conferenza PostgreSQL', '2023-12-01'),
       ('Compleanno', '2023-10-12');

-- Query di selezione
SELECT * FROM events;

Risultato:

event_name event_date
Conferenza PostgreSQL 2023-12-01
Compleanno 2023-10-12

Tipo TIME

Il tipo TIME salva SOLO l’orario, cioè ore, minuti e secondi. È perfetto per cose tipo orari degli autobus o fasce orarie di apertura dei negozi.

Esempi:

-- Esempio di creazione tabella con `TIME`
CREATE TABLE schedules (
    schedule_name TEXT,
    start_time TIME,
    end_time TIME
);

-- Inserimento dati
INSERT INTO schedules (schedule_name, start_time, end_time)
VALUES ('Orario di lavoro', '09:00:00', '18:00:00'),
       ('Pausa pranzo', '13:00:00', '14:00:00');

-- Query di selezione
SELECT schedule_name, start_time, end_time FROM schedules;

Risultato:

schedule_name start_time end_time
Orario di lavoro 09:00:00 18:00:00
Pausa pranzo 13:00:00 14:00:00

Tipo TIMESTAMP

Il tipo TIMESTAMP mette insieme data e ora in un solo valore. Però NON tiene conto dei fusi orari. Questo può creare confusione se i dati vengono usati da utenti in fusi orari diversi.

Esempi:

-- Esempio di creazione tabella con `TIMESTAMP`
CREATE TABLE documents (
    document_id SERIAL PRIMARY KEY,
    created_at TIMESTAMP
);

-- Inserimento dati
INSERT INTO documents (created_at)
VALUES ('2023-10-12 15:30:00'),
       ('2023-12-01 08:45:15');

-- Query di selezione
SELECT document_id, created_at FROM documents;

Risultato:

document_id created_at
1 2023-10-12 15:30:00
2 2023-12-01 08:45:15

Tipo TIMESTAMPTZ

Il tipo TIMESTAMPTZ (dove TZ sta per "time zone") è simile a TIMESTAMP, ma in più salva anche il fuso orario. Questo lo rende indispensabile per app che lavorano con utenti internazionali.

Esempi:

-- Esempio di creazione tabella con `TIMESTAMPTZ`
CREATE TABLE meetings (
    meeting_id SERIAL PRIMARY KEY,
    meeting_time TIMESTAMPTZ
);

-- Inserimento dati (PostgreSQL salva il fuso orario attuale)
INSERT INTO meetings (meeting_time)
VALUES ('2023-10-12 15:30:00+03'),
       ('2023-12-01 08:45:15-05');

-- Query di selezione
SELECT meeting_id, meeting_time FROM meetings;

Risultato:

meeting_id meeting_time
1 2023-10-12 15:30:00+03:00
2 2023-12-01 08:45:15-05:00

Nota che PostgreSQL converte automaticamente l’orario nel fuso orario del server.

Vantaggi di usare tipi di dati specializzati

Correttezza dei dati. Tipi come DATE e TIMESTAMP impediscono di inserire dati sbagliati. Ad esempio, non puoi scrivere una data che non esiste, tipo "2023-02-30".

Comodità d’uso. Puoi confrontare le date, sottrarle tra loro, ottenere la data attuale e persino arrotondare i valori (di questo parleremo più avanti).

Performance. I tipi temporali occupano meno spazio in memoria e negli indici rispetto alle stringhe, quindi le query vanno più veloci.

Esempio: creazione di una tabella con tutti i tipi

Facciamo una tabella più complessa per gestire il calendario degli eventi. Useremo diversi tipi insieme: DATE, TIME, TIMESTAMP e 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
);

-- Inseriamo i dati
INSERT INTO event_schedule (
    event_name, event_date, start_time, end_time, full_start, full_start_with_zone
)
VALUES
    ('Meetup mattutino', '2023-11-10', '10:00:00', '11:30:00', '2023-11-10 10:00:00', '2023-11-10 10:00:00+03'),
    ('Workshop serale', '2023-11-11', '18:00:00', '20:00:00', '2023-11-11 18:00:00', '2023-11-11 18:00:00+03');

-- Controlliamo i dati
SELECT * FROM event_schedule;

Risultato:

event_id event_name event_date start_time end_time full_start fullstartwith_zone
1 Meetup mattutino 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 serale 2023-11-11 18:00:00 20:00:00 2023-11-11 18:00:00 2023-11-11 18:00:00+03:00

Questo è un esempio reale di database per gestire i calendari. Si vede come i diversi formati temporali si completano a vicenda, a seconda di cosa ti serve.

Spero che ora ti ricordi come usare i tipi DATE, TIME, TIMESTAMP e TIMESTAMPTZ in PostgreSQL. Nelle prossime lezioni andremo più a fondo sulle funzioni temporali e impareremo a estrarre, formattare e gestire i dati temporali con le query SQL.

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