0Pricing
Coding Interview Prep · Lezione

Aritmetica delle date e intervalli

Come sommare o sottrarre periodi e calcolare le differenze tra date.

Aritmetica delle date e intervalli è una lezione Coding Interview Prep gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.

Perché nei colloqui compare l'aritmetica delle date

L'aritmetica delle date è una delle competenze SQL più pratiche, quindi chi conduce i colloqui vi fa spesso ricorso per i ruoli di analista e backend. Quasi ogni domanda aziendale ha una componente temporale: ultimi 30 giorni, ordini per settimana, giorni trascorsi dalla registrazione.

Il problema è che le funzioni per le date sono la parte meno standardizzata di SQL. La stessa operazione ha sintassi diverse in PostgreSQL, MySQL e SQL Server. Un candidato preparato espone chiaramente il concetto, quindi adatta la sintassi al dialetto.

  • Aggiungere o sottrarre un intervallo
  • Calcolare la differenza tra due date
  • Utilizzare valori INTERVAL

Il tipo INTERVAL

In PostgreSQL e nello standard SQL, un periodo di tempo è un valore di prima classe chiamato intervallo. Lo si aggiunge a una data o a un timestamp con i semplici operatori + e -.

Questo è il modo più chiaro per esprimere «30 giorni fa» o «tra 3 mesi» e piace molto a chi conduce i colloqui perché si legge quasi come una frase in inglese.

SELECT
  CURRENT_DATE,
  CURRENT_DATE + INTERVAL '7 days'   AS next_week,
  CURRENT_DATE - INTERVAL '1 month'  AS last_month,
  NOW() + INTERVAL '90 minutes'      AS soon;

Aggiungere intervalli nei diversi dialetti

Nei colloqui viene spesso chiesto: «come aggiungerebbe 7 giorni in MySQL rispetto a SQL Server?». Conoscere i tre principali dialetti dimostra un'esperienza concreta.

  • PostgreSQL: d + INTERVAL '7 days'
  • MySQL: DATE_ADD(d, INTERVAL 7 DAY)
  • SQL Server: DATEADD(day, 7, d)

Il concetto è identico; cambia solo la sintassi. Indichi sempre il dialetto per cui sta scrivendo.

-- MySQL
SELECT DATE_ADD(order_date, INTERVAL 7 DAY) AS due_date FROM orders;

-- SQL Server
SELECT DATEADD(day, 7, order_date) AS due_date FROM orders;

Differenza tra due date

L'altra metà dell'aritmetica delle date consiste nel calcolare la distanza tra due date. Il risultato dipende dall'unità e dal dialetto.

In PostgreSQL, la sottrazione di due valori date restituisce direttamente un numero intero di giorni. La sottrazione di due valori timestamp restituisce invece un intervallo.

-- Postgres: date - date returns an integer (days)
SELECT shipped_date - order_date AS days_to_ship
FROM orders;

DATEDIFF e le sue insidie

DATEDIFF esiste in MySQL e SQL Server, ma si comporta in modo diverso: è una delle insidie preferite nei colloqui.

  • MySQL: DATEDIFF(end, start) restituisce solo giorni interi.
  • SQL Server: DATEDIFF(unit, start, end) accetta un'unità e conta i passaggi di confine, non le unità complete.

Questo comportamento è importante: DATEDIFF(year, '2023-12-31', '2024-01-01') in SQL Server restituisce 1, anche se è trascorso un solo giorno.

-- SQL Server: counts boundaries, not elapsed time
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01'); -- 1
SELECT DATEDIFF(day,  '2023-12-31', '2024-01-01'); -- 1

Calcolare correttamente l'età in anni

«Calcolare l'età di un cliente in anni» è una domanda classica. Dividere per 365 la differenza in giorni calcolata in modo ingenuo produce errori progressivi a causa degli anni bisestili. PostgreSQL dispone di AGE(), che restituisce un vero intervallo del calendario.

Per ottenere un conteggio intero pulito degli anni, estragga la parte relativa agli anni dall'età.

-- Postgres
SELECT
  birth_date,
  AGE(CURRENT_DATE, birth_date)               AS exact_age,
  EXTRACT(YEAR FROM AGE(CURRENT_DATE, birth_date)) AS age_years
FROM customers;

Esempio svolto: ordini negli ultimi 30 giorni

È un filtro quasi universale nei colloqui. Il modo corretto consiste nel confrontare la colonna della data con una soglia calcolata, non nell'applicare una funzione alla colonna.

Confrontare order_date con una soglia costante mantiene utilizzabile qualsiasi indice presente su order_date. Torneremo più avanti su questo aspetto degli indici.

SELECT COUNT(*) AS recent_orders
FROM orders
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days';

Intervalli semiaperti per un mese di calendario

Quando Le viene chiesto di ottenere «tutti gli ordini di marzo 2024», eviti di usare BETWEEN '2024-03-01' AND '2024-03-31' su una colonna timestamp. In questo modo si perdono le righe delle 23:00 del 31 marzo e si rischiano errori di un'unità.

Lo schema robusto è un intervallo semiaperto: >= dall'inizio e < dall'inizio del mese successivo. Funziona con qualsiasi precisione della colonna.

SELECT *
FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

EXTRACT e le parti della data

Estrarre un singolo componente da una data è un'operazione ricorrente nei report. La funzione standard è EXTRACT(part FROM d), supportata da PostgreSQL e MySQL.

  • EXTRACT(YEAR FROM d), MONTH, DAY
  • EXTRACT(DOW FROM d) per il giorno della settimana
  • SQL Server utilizza invece DATEPART(weekday, d)

Nota: estrarre solo MONTH raggruppa insieme i mesi di marzo di anni diversi, cosa che raramente si desidera.

SELECT
  EXTRACT(YEAR  FROM order_ts) AS yr,
  EXTRACT(MONTH FROM order_ts) AS mo,
  COUNT(*) AS n
FROM orders
GROUP BY 1, 2
ORDER BY 1, 2;

Esempio approfondito: giorni al prossimo compleanno

È un problema di aritmetica più complesso, che combina estrazione e addizione. Costruisca il compleanno di quest'anno a partire dal mese e dal giorno di nascita e, se è già passato, lo sposti all'anno successivo.

Spiegare il ragionamento ad alta voce dimostra a chi conduce il colloquio che sa gestire casi limite come un compleanno già trascorso nell'anno corrente.

-- Postgres
SELECT
  name,
  CASE
    WHEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) >= CURRENT_DATE
    THEN MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
    ELSE MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::int + 1,
                   EXTRACT(MONTH FROM birth_date)::int,
                   EXTRACT(DAY FROM birth_date)::int) - CURRENT_DATE
  END AS days_until
FROM customers;

Primo e ultimo giorno del mese

«Mi dia l'ultimo giorno del mese di ciascun ordine» verifica se si ricorre a una funzione integrata o se la si reimplementa. PostgreSQL combina DATE_TRUNC con l'aritmetica degli intervalli; MySQL dispone direttamente di LAST_DAY().

Il trucco per ottenere l'ultimo giorno in Postgres consiste nel troncare alla data iniziale del mese, aggiungere un mese e sottrarre un giorno.

-- Postgres
SELECT
  DATE_TRUNC('month', order_ts)                              AS month_start,
  DATE_TRUNC('month', order_ts) + INTERVAL '1 month - 1 day' AS month_end
FROM orders;

-- MySQL: LAST_DAY(order_ts)

Verifica rapida

Verifichi di aver compreso il comportamento della differenza tra date nei diversi dialetti.

Riepilogo: aritmetica delle date e intervalli

Punti chiave per il colloquio:

  • Utilizzi i valori INTERVAL con +/- in Postgres; DATE_ADD/DATEDIFF in MySQL; DATEADD/DATEDIFF in SQL Server.
  • SQL Server DATEDIFF conta i passaggi di confine, non le unità trascorse: è l'insidia principale.
  • Per l'età in anni, estragga il valore da AGE() invece di dividere i giorni per 365.
  • Filtri le righe recenti confrontando la colonna con una soglia calcolata e utilizzi intervalli semiaperti (>= start AND < next) per gli intervalli mensili.

Esponga prima il concetto, quindi adatti il dialetto.

Domande Frequenti

La lezione «Aritmetica delle date e intervalli» è gratuita?

Sì — il testo completo di «Aritmetica delle date e intervalli» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Aritmetica delle date e intervalli»?

Come sommare o sottrarre periodi e calcolare le differenze tra date. Eserciti Coding Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Coding Interview Prep?

Non è richiesta alcuna esperienza precedente. Coding Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Aritmetica delle date e intervalli»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Coding Interview Prep?

Sì. Ogni lezione Coding Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Aritmetica delle date e intervalli
  2. Troncare e raggruppare le date
  3. Analizzare e formattare stringhe
  4. Fusi orari e timestamp
← Torna a Coding Interview Prep