L’allenamento dura un’ora e mezza, la giornata lavorativa — 8 ore, la pausa — 20 minuti, e per bollire le uova servono 10 minuti. Tutto questo riguarda gli intervalli di tempo.
Gli intervalli di tempo sono super utili nelle app reali, tipo quando devi calcolare le scadenze delle task, trovare la differenza tra due date o aggiungere/sottrarre tempo. Ma prima di entrare nei dettagli, facciamo un rapido ripasso di dove eravamo rimasti nelle lezioni precedenti.
In PostgreSQL INTERVAL è un tipo di dato speciale pensato per rappresentare periodi di tempo. Diversamente dagli altri tipi temporali, non salva una data o un orario specifico, ma descrive un periodo, tipo: "2 giorni", "3 ore", "5 minuti".
Sintassi di INTERVAL
Gli intervalli si possono scrivere così:
INTERVAL 'numero unita_di_tempo'
Esempi:
INTERVAL '2 days' -- Due giorni
INTERVAL '3 hours' -- Tre ore
INTERVAL '15 minutes' -- Quindici minuti
INTERVAL '1 day 2 hours' -- Un giorno e due ore
PostgreSQL supporta varie unità di tempo: year, month, day, hour, minute, second. Puoi combinarle tutte nella stessa espressione.
Usare gli intervalli nelle query
Il tipo INTERVAL diventa davvero utile quando lo usi insieme agli altri tipi temporali (DATE, TIMESTAMP). Vediamo le operazioni base.
Aggiungere un intervallo a una data/orario
Puoi aggiungere intervalli a valori di data o orario. Tipo:
SELECT CURRENT_DATE + INTERVAL '7 days' AS delivery_date;
-- Ottieni la data tra 7 giorni da oggi
Risultato:
| delivery_date |
|---|
| 2023-10-08 |
Sottrarre intervalli da data/orario
Oltre ad aggiungere, puoi anche sottrarre intervalli:
SELECT NOW() - INTERVAL '2 hours' AS two_hours_ago;
-- Ottieni l’orario di due ore fa
Risultato:
| two_hours_ago |
|---|
| 2023-10-01 10:00:00.000 |
Calcolare la differenza tra due date
Una delle cose più potenti di INTERVAL è calcolare la differenza tra due date:
SELECT '2023-10-15'::DATE - '2023-10-01'::DATE AS days_difference;
-- Quanti giorni tra due date
Risultato:
| days_difference |
|---|
| 14 days |
Nota che anche qui il risultato è un intervallo di tempo.
Esempi pratici con INTERVAL
Calcolo della data di consegna. Immagina un e-commerce dove la consegna richiede da 3 a 7 giorni. Ecco come puoi calcolare le possibili date di consegna:
SELECT CURRENT_DATE + INTERVAL '3 days' AS earliest_delivery,
CURRENT_DATE + INTERVAL '7 days' AS latest_delivery;
Risultato:
| earliest_delivery | latest_delivery |
|---|---|
| 2023-10-04 | 2023-10-08 |
Gestione del tempo di completamento di una task. Supponiamo di avere una tabella tasks dove ogni task ha una data di inizio. Devi calcolare la data di fine considerando la durata in ore:
CREATE TABLE tasks (
task_id SERIAL PRIMARY KEY,
task_name TEXT,
start_time TIMESTAMP,
duration INTERVAL
);
INSERT INTO tasks (task_name, start_time, duration)
VALUES
('Preparare report', '2023-10-01 09:00:00', INTERVAL '4 hours'),
('Testare applicazione', '2023-10-01 10:00:00', INTERVAL '2 hours 30 minutes');
SELECT task_name,
start_time,
start_time + duration AS end_time
FROM tasks;
Risultato:
| task_name | start_time | end_time |
|---|---|---|
| Preparare report | 2023-10-01 09:00:00 | 2023-10-01 13:00:00 |
| Testare applicazione | 2023-10-01 10:00:00 | 2023-10-01 12:30:00 |
Confrontare i tempi di completamento. A volte vuoi trovare tutte le task che sono state completate in meno di 3 ore:
SELECT task_name
FROM tasks
WHERE duration < INTERVAL '3 hours';
Risultato:
| task_name |
|---|
| Testare applicazione |
Trucchetti utili con gli intervalli
Calcolo dinamico degli intervalli. Puoi combinare gli intervalli con altre operazioni. Ad esempio, prendere il numero di giorni da una colonna e trasformarlo in un intervallo:
SELECT CURRENT_DATE + (order_days || ' days')::INTERVAL AS order_due_date
FROM orders;
Convertire intervalli in stringa. A volte ti serve convertire un intervallo in stringa per mostrarlo:
SELECT INTERVAL '2 days 3 hours'::TEXT AS interval_text;
Risultato:
| interval_text |
|---|
| 2 days 03:00:00 |
Errori comuni con INTERVAL
Lavorare con INTERVAL, anche se è super potente, può creare qualche grattacapo. Uno degli errori tipici è usare il formato sbagliato. Ad esempio, se provi INTERVAL '2 hours and 30 minutes', ti becchi un errore perché PostgreSQL non capisce la parola "and". Il modo giusto: INTERVAL '2 hours 30 minutes'.
Un altro errore è dimenticare di specificare l’unità di tempo, tipo INTERVAL '2'. PostgreSQL non sa cosa sia quel "2", quindi specifica sempre l’unità (2 days, 2 hours).
GO TO FULL VERSION