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.
GO TO FULL VERSION