CodeGym /Corsi /SQL SELF /Lavorare con intervalli di tempo: INTERVAL

Lavorare con intervalli di tempo: INTERVAL

SQL SELF
Livello 31, Lezione 4
Disponibile

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).

2
Compito
SQL SELF, livello 31, lezione 4
Bloccato
Calcolo dell'orario di fine dei task
Calcolo dell'orario di fine dei task
1
Sondaggio/quiz
Lavorare con date e orari, livello 31, lezione 4
Non disponibile
Lavorare con date e orari
Lavorare con date e orari
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION