Corso
Capire come interrogare date successive a una determinata data è fondamentale per una gestione e un'analisi efficaci dei database. Questo tutorial offre una guida completa al confronto delle date in SQL sui diversi sistemi di database SQL, tra cui SQL Server, PostgreSQL e Oracle. Che tu ti occupi di analisi storiche, reportistica o filtraggio dei record, padroneggiare questa tecnica potenzierà le tue capacità di interrogazione SQL.
Al termine di questa guida, sarai in grado di:
- Comprendere le sfumature dei formati e delle funzioni data nei diversi database SQL, tra cui SQL Server, PostgreSQL e Oracle.
- Applicare esempi pratici a scenari reali.
Se sei un data analyst o un data scientist pronto a imparare di più, ti consiglio lo skill track SQL Fundamentals di DataCamp per familiarizzare con le query ai database. E per chi desidera ampliare le proprie competenze sui database, dai un'occhiata al corso Database Design, che offre spunti su come costruire database efficienti.
Introduzione ai confronti di date in SQL
Il confronto delle date è importante in SQL perché consente ai professionisti dei dati di filtrare e ordinare i dati durante l'analisi. Il metodo è particolarmente utile nella reportistica finanziaria o nella gestione dell'inventario, che richiedono analisi delle tendenze.
L'operatore "maggiore di" (>) di SQL si usa con le date per confrontare due valori data. Quando includi l'operatore "maggiore di" in una query SQL con date, la query restituisce i record con date successive alla data specificata. Per esempio, la query seguente restituirà le righe nella tabella Orders in cui OrderDate è successiva a 2023-01-01.
SELECT *
FROM Orders
WHERE OrderDate > '2023-01-01';
Iniziamo rivedendo rapidamente gli operatori SQL di base che si possono usare per filtrare i dati. Questi operatori sono trattati anche nella nostra SQL Basics Cheat Sheet, che puoi consultare prima di provare gli esempi qui sotto.
Uguale a (=)
L'operatore = si usa in SQL per verificare se due valori sono uguali. Di seguito un esempio di utilizzo con un valore data. La query SQL restituirà le righe nella tabella Orders in cui OrderDate è uguale a 2023-01-01.
-- Seleziona tutti gli ordini effettuati il 1° gennaio 2023
SELECT *
FROM Orders
WHERE OrderDate = '2023-01-01';
Diverso da (!= o <>)
L'operatore != o <> confronta due valori e restituisce quelli che non sono uguali a quelli di riferimento. Per esempio, se usato con un valore data, l'operatore != o <> restituirà le righe diverse dalla data di riferimento. Puoi anche leggere il nostro tutorial SQL NOT EQUAL Operator: A Beginner's Guide per apprenderne le sottigliezze.
-- Seleziona tutti gli ordini che non sono stati effettuati il 1° gennaio 2023
SELECT *
FROM Orders
WHERE OrderDate != '2023-01-01';
-- Sintassi alternativa con <>
SELECT *
FROM Orders
WHERE OrderDate <> '2023-01-01';
Minore di (<)
L'operatore < si usa in SQL per verificare se il valore a sinistra è inferiore a quello a destra. Quando lo usi in una query SQL con valori data, la query restituirà i record con date precedenti alla data specificata. Per esempio, la query seguente restituirà le righe nella tabella Orders in cui OrderDate è precedente a 2023-01-01.
-- Seleziona tutti gli ordini effettuati prima del 1° gennaio 2023
SELECT *
FROM Orders
WHERE OrderDate < '2023-01-01';
Maggiore o uguale a (>=)
L'operatore >= verifica se i valori a sinistra dell'operatore sono maggiori o uguali al valore a destra. Quando l'operatore si usa in SQL per interrogare un valore data, restituirà i record in cui le date sono solo uguali o successive al valore di riferimento.
-- Seleziona tutti gli ordini effettuati il 1° gennaio 2023 o dopo
SELECT *
FROM Orders
WHERE OrderDate >= '2023-01-01';
Minore o uguale a (<=)
L'operatore <= si usa in SQL per verificare se i valori a sinistra dell'operatore sono minori o uguali al valore a destra. Quando l'operatore si usa per interrogare un valore data, restituirà i record in cui le date sono solo uguali o precedenti al valore di riferimento.
-- Seleziona tutti gli ordini effettuati il 1° gennaio 2023 o prima
SELECT *
FROM Orders
WHERE OrderDate <= '2023-01-01';
Confronto di date in SQL Server
Possiamo confrontare le date in SQL Server usando i seguenti operatori: <, <=, >, >= ed =. Tuttavia, tratteremo quanto segue:
Uso dell'operatore "maggiore di" (>)
L'operatore "maggiore di" (>) in SQL Server si usa per filtrare le date successive alla data di confronto posta a destra dell'operatore. Per esempio, la query seguente filtra la tabella Orders e restituisce i record degli ordini consegnati dopo OrderDate 2023-01-01.
-- Seleziona tutti gli ordini consegnati dopo il 1° gennaio 2023
SELECT *
FROM Orders
WHERE DeliveryDate > '2023-01-01';
Uso della funzione GETDATE()
La funzione GETDATE() in SQL Server restituisce la data corrente registrata nel sistema dell'utente. Puoi quindi usare questa funzione per interrogare i dati e filtrare le righe in cui la data è successiva alla data corrente.
-- Seleziona tutti gli ordini consegnati dopo la data e l'ora correnti
SELECT *
FROM Orders
WHERE DeliveryDate > GETDATE();
Uso di BETWEEN per intervalli di date
L'operatore BETWEEN in SQL si usa per filtrare valori compresi in un intervallo dato. Se usato in SQL Server con le date, puoi filtrare le righe che contengono date entro l'intervallo indicato. I risultati includeranno sia la data di inizio sia quella di fine come scritto nella query.
-- Seleziona tutti gli ordini consegnati tra il 1° gennaio 2023 e il 31 dicembre 2023
SELECT *
FROM Orders
WHERE DeliveryDate BETWEEN '2023-01-01' AND '2023-12-31';
Uso di CAST e CONVERT per intervalli di date
Puoi anche usare le funzioni CAST e CONVERT per prevenire errori. Queste funzioni garantiscono che i valori data vengano interpretati e formattati correttamente.
-- Converte una stringa in una data
SELECT CAST('2023-06-26' AS DATE) AS ConvertedDate;
-- Converte una stringa in un datetime
SELECT CAST('2023-06-26 14:30:00' AS DATETIME) AS ConvertedDateTime;
-- Converte una stringa in una data usando CONVERT
SELECT CONVERT(DATE, '2023-06-26') AS ConvertedDate;
-- Converte una stringa in un datetime usando CONVERT
SELECT CONVERT(DATETIME, '2023-06-26 14:30:00') AS ConvertedDateTime;
Confronto di date in PostgreSQL
PostgreSQL ha alcune clausole diverse usate per confrontare le date. Ne discutiamo alcune qui sotto.
Uso dell'operatore "maggiore di" (>)
Analogamente a SQL Server, l'operatore > in PostgreSQL filtra le date successive alla data di confronto.
-- Seleziona tutti gli ordini effettuati dopo il 1° gennaio 2023
SELECT *
FROM Orders
WHERE OrderDate > '2023-01-01';
Uso della funzione EXTRACT
La funzione EXTRACT in PostgreSQL si usa per recuperare campi di una data come anno, mese o giorno. Nella query seguente, la clausola EXTRACT filtra i record per l'ANNO 2023.
-- Seleziona tutti gli ordini effettuati nell'anno 2023
SELECT *
FROM Orders
WHERE EXTRACT(YEAR FROM OrderDate) = 2023;
Uso della funzione INTERVAL
La funzione INTERVAL in PostgreSQL si usa per effettuare alcuni calcoli sulle date. INTERVAL ti consente di aggiungere o sottrarre quantità specifiche di tempo a o da una data.
-- Seleziona tutti gli ordini effettuati negli ultimi 30 giorni
SELECT *
FROM Orders
-- Filtra gli ordini effettuati negli ultimi 30 giorni a partire dalla data corrente
WHERE OrderDate > NOW() - INTERVAL '30 days';
Uso della funzione DATE_PART
La funzione DATE_PART consente di estrarre un sotto-campo dal valore data. Questo sotto-campo può essere la data oppure l'ora. La query seguente restituisce gli ordini effettuati a marzo, restituendo un valore a doppia precisione pari a 3 per il terzo mese.
-- Seleziona tutti gli ordini effettuati a marzo
SELECT *
FROM Orders
WHERE DATE_PART('month', OrderDate) = 3;
Uso della funzione TO_DATE
La funzione TO_DATE in PostgreSQL converte una determinata stringa in un valore data in base al formato specificato. Nella query seguente, il valore data è fornito come stringa. Quindi lo converti in data con il formato YYYY-MM-DD.
-- Seleziona tutti gli ordini effettuati il 1° gennaio 2023 usando una data in stringa
SELECT *
FROM Orders
WHERE OrderDate = TO_DATE('2023-01-01', 'YYYY-MM-DD');
Uso di BETWEEN per intervalli di date
Come in SQL Server, la clausola BETWEEN in PostgreSQL filtra i dati entro un intervallo specifico. Per valori che contengono date, la funzione BETWEEN filtra e restituisce le righe comprese tra le date indicate. Queste date sono incluse nei risultati.
-- Seleziona tutti gli ordini effettuati tra il 1° gennaio 2023 e il 31 dicembre 2023
SELECT *
FROM Orders
WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31';
Confronto di date in Oracle
Uso dell'operatore "maggiore di" (>)
L'operatore > filtra le date successive alla data di confronto.
-- Seleziona tutti gli utenti attivi con una data di fine nel futuro
SELECT *
FROM Users
-- Filtra gli utenti con stato 'Active'
WHERE Status = 'Active'
-- Assicurati che la data di fine sia nel futuro
AND EndDate > SYSDATE;
Gestione di date NULL e condizioni complesse
Quando confronti date in un database Oracle, è importante gestire scenari complessi, come date vuote. In questo caso, usiamo la clausola IS NULL per filtrare i record senza data.
-- Seleziona tutti gli utenti attivi con una data di fine futura o senza data di fine (NULL)
SELECT *
FROM Users
-- Filtra gli utenti con stato 'Active'
WHERE Status = 'Active'
-- Assicurati che la data di fine sia nel futuro o sia NULL (nessuna data di fine)
AND (EndDate > SYSDATE OR EndDate IS NULL);
Uso di BETWEEN per intervalli di date
La clausola BETWEEN si usa anche in Oracle per filtrare i dati all'interno di un intervallo specifico. Per valori che contengono date, la funzione BETWEEN filtra e restituisce i record compresi tra le date indicate. Queste date sono incluse nei risultati.
-- Seleziona tutti gli utenti attivi con una data di fine tra la data corrente e una data futura specificata (es., fine anno)
SELECT *
FROM Users
-- Filtra gli utenti con stato 'Active'
WHERE Status = 'Active'
-- Assicurati che la data di fine sia compresa tra la data corrente e una data futura specificata (es., 31 dicembre 2023)
AND EndDate BETWEEN SYSDATE AND DATE '2023-12-31';
Errori comuni e buone pratiche
Mi è capitato di riscontrare problemi con le date e l'operatore "maggiore di" in SQL. Ecco alcuni errori frequenti che ho individuato e consigli su come evitarli.
Formati data incoerenti
Usare formati data incoerenti nelle query porterà a errori. Potresti non ottenere i risultati desiderati se mescoli formati come YYYY-MM-DD e MM-DD-YYYY.
Per evitare questi problemi, assicurati sempre di usare un formato data standard. Puoi anche convertire la data nel formato preferito o secondo le convenzioni locali usando TO_DATE nei database PostgreSQL o Oracle. Per SQL Server, puoi usare le funzioni CAST e CONVERT.
-- Converte una stringa in una data
SELECT CAST('2023-06-26' AS DATE) AS ConvertedDate;
-- Converte una stringa in un datetime
SELECT CAST('2023-06-26 14:30:00' AS DATETIME) AS ConvertedDateTime;
-- Converte una stringa in una data usando CONVERT
SELECT CONVERT(DATE, '2023-06-26') AS ConvertedDate;
-- Converte una stringa in un datetime usando CONVERT
SELECT CONVERT(DATETIME, '2023-06-26 14:30:00') AS ConvertedDateTime;
Gestione dei fusi orari
Potresti ottenere risultati imprecisi quando gestisci dati in più fusi orari. Inoltre, non considerare le differenze di fuso orario durante la conversione delle date può causare errori.
Perciò, consiglio di archiviare le date in UTC (Tempo coordinato universale) e usare le funzioni integrate sui fusi orari per convertire le date.
-- Archivia le date in UTC e convertile nel fuso orario locale
SELECT *
FROM Orders
-- Filtra gli ordini in cui OrderDate in UTC è successivo alla data corrente nel fuso orario 'America/New_York'
WHERE OrderDate AT TIME ZONE 'UTC' > SYSDATE AT TIME ZONE 'America/New_York';
-- Usa funzioni sui fusi orari per confronti accurati
SELECT *
FROM Users
-- Filtra gli utenti in cui EndDate in UTC è successivo alla data corrente in UTC
WHERE EndDate AT TIME ZONE 'UTC' > SYSDATE AT TIME ZONE 'UTC';
Evitare errori comuni con le date
Quando lavori con le date, è importante evitare errori recuperando solo i valori necessari alla tua analisi. Per esempio, puoi omettere il componente orario in un valore data se non è rilevante per l'analisi. Gestisci esplicitamente i valori NULL per prevenire errori, soprattutto dove i valori data potrebbero contenerli.
Scrivere query leggibili e manutenibili
Potresti ritrovarti a scrivere query complesse e annidate, che rendono difficile leggere e seguire le diverse clausole. Allo stesso modo, non includere commenti nel codice rende difficile spiegarne il funzionamento.
Per questo, ti consiglio di includere commenti che spieghino la logica dietro le clausole. Per rendere le query leggibili, puoi usare anche semplici sottoquery o Common Table Expressions (CTE). Dai un'occhiata al nostro corso Reporting in SQL per approfondire come scrivere query leggibili e manutenibili per analisi e reportistica.
Una nota sul perché i metodi SQL differiscono
La varietà di metodi SQL per i confronti di date tra diversi sistemi di database come SQL Server, PostgreSQL e Oracle deriva dall'evoluzione e dalle filosofie progettuali uniche di ciascun sistema di gestione di database. Ogni sistema è stato sviluppato in modo indipendente e orientato a diverse esigenze degli utenti e requisiti di compatibilità, portando a implementazioni variegate degli standard SQL e a funzionalità proprietarie aggiuntive.
Per esempio:
- SQL Server, sviluppato da Microsoft, incorpora funzioni e sintassi allineate da vicino ad altri prodotti Microsoft, puntando all'integrazione e alla facilità d'uso nell'ecosistema Windows.
- PostgreSQL è un progetto open-source con una forte enfasi sull'estendibilità. Questa flessibilità incoraggia una varietà di funzioni e operatori per le date che possono essere ottimizzati o estesi dalla sua community.
- Oracle si concentra tipicamente su elevata scalabilità e affidabilità per applicazioni enterprise, portando a ottimizzazioni specifiche nel modo in cui vengono gestite le date e altri tipi di dati, spesso con un focus su ambienti transazionali complessi e ad alto volume.
Conclusione
Ti invito a esercitarti con le diverse tecniche per capire quando applicare le funzioni SQL in scenari reali. Valuta di seguire i corsi di DataCamp SQL Fundamentals e Intermediate SQL. Consiglio anche il corso Associate Data Analyst in SQL a chi aspira a diventare data analyst o data scientist per aiutarti a padroneggiare diverse tecniche di analisi. Questi corsi ti aiuteranno anche a prepararti per la SQL Associate Certification, un ottimo plus sul curriculum.
Domande frequenti
Che cos'è un operatore di confronto?
Gli operatori di confronto confrontano due valori e restituiscono risultati in base al fatto che i valori siano veri o falsi rispetto al valore confrontato.
Quali sono gli operatori comuni usati con i valori data in SQL?
Gli operatori più comuni usati con i valori data in SQL includono uguale a (=), maggiore di (>), minore di (<), maggiore o uguale a (>=), minore o uguale a (<=).
Quando si usa l'operatore BETWEEN in SQL?
L'operatore BETWEEN filtra i record all'interno di un determinato intervallo.
Che operatore devo usare se le mie date hanno valori NULL?
Dovresti includere la clausola IS NULL per gestire i valori null e evitare errori nei risultati della query.
Cosa devo fare se la mia query SQL restituisce errori quando filtro il valore data?
Verifica che le tue date siano nel formato corretto. In caso contrario, convertili in un formato coerente come YYYY-MM-DD.


