SQL Generate Date: Come Generare Date in PostgreSQL

Introduzione

Quando si lavora con database SQL, spesso è necessario generare date in base a specifiche esigenze, come intervalli temporali, date casuali o serie temporali per report e analisi. In questo articolo, vedremo come generare date in SQL utilizzando PostgreSQL, fornendo esempi pratici e dettagliati per comprendere ogni tecnica.

Generare una Singola Data in SQL

Se vogliamo generare una singola data in PostgreSQL, possiamo usare DATE, TIMESTAMP e CURRENT_DATE. La sintassi base consente di definire una data esplicita o recuperare quella corrente dal sistema.

SELECT DATE '2025-02-17';

Restituisce:

2025-02-17

Possiamo anche ottenere la data corrente con la funzione CURRENT_DATE, utile per generare report dinamici:

SELECT CURRENT_DATE;

Restituisce, ad esempio:

2025-02-17

Generare un Intervallo di Date con generate_series

Se vogliamo ottenere una serie di date tra due estremi, possiamo usare generate_series. Questa funzione genera un set di righe con valori incrementali tra due date specificate. Il terzo parametro indica l’intervallo tra una data e l’altra.

Ecco un esempio per generare un elenco di date giornaliere per un mese:

SELECT generate_series(
    '2025-02-01'::DATE, 
    '2025-02-28'::DATE, 
    '1 day'::INTERVAL
);

Restituisce un elenco di date dal 1 al 28 febbraio 2025.

Se invece vogliamo ottenere solo le date settimanali (ogni 7 giorni), possiamo modificare l’intervallo:

SELECT generate_series(
    '2025-02-01'::DATE, 
    '2025-03-31'::DATE, 
    '1 week'::INTERVAL
);

Restituisce:

2025-02-01
2025-02-08
2025-02-15
...
2025-03-29

Generare Date con Timestamp

Se vogliamo includere l’orario, possiamo usare TIMESTAMP. L’uso dell’intervallo permette di generare timestamp a intervalli regolari, come ogni ora.

SELECT generate_series(
    '2025-02-01 00:00:00'::TIMESTAMP, 
    '2025-02-01 23:59:59'::TIMESTAMP, 
    '1 hour'::INTERVAL
);

Restituisce un elenco di timestamp a cadenza oraria.

Generare Date Casuali

Per generare date casuali possiamo sfruttare la funzione random(), che genera un valore tra 0 e 1, moltiplicato per un range di giorni. Il risultato viene troncato con trunc() per ottenere un numero intero da sommare alla data di partenza.

SELECT '2025-01-01'::DATE + trunc(random() * 60)::int AS random_date;

Restituisce, ad esempio:

2025-02-10

Per generare più date casuali in un’unica query:

SELECT '2025-01-01'::DATE + trunc(random() * 60)::int AS random_date
FROM generate_series(1, 10);

Restituisce 10 date casuali nel range specificato.

Generare il Primo o l’Ultimo Giorno del Mese

Per ottenere il primo giorno del mese corrente:

SELECT date_trunc('month', CURRENT_DATE)::DATE;

Restituisce:

2025-02-01

Per ottenere l’ultimo giorno del mese:

SELECT (date_trunc('month', CURRENT_DATE) + INTERVAL '1 month - 1 day')::DATE;

Qui date_trunc('month', CURRENT_DATE) tronca la data al primo giorno del mese, e l’aggiunta di INTERVAL '1 month - 1 day' ci porta all’ultimo giorno del mese corrente.

Restituisce:

2025-02-29

Casi d’Uso Pratici

1. Generare Date per un Report Mensile

Se dobbiamo generare tutte le date di un mese per un report:

SELECT generate_series(
    date_trunc('month', CURRENT_DATE)::DATE,
    (date_trunc('month', CURRENT_DATE) + INTERVAL '1 month - 1 day')::DATE,
    '1 day'::INTERVAL
);

Restituisce tutte le date del mese corrente.

2. Selezionare Dati Solo nei Weekend

Se vogliamo filtrare solo sabati e domeniche:

SELECT generate_series(
    '2025-02-01'::DATE,
    '2025-02-28'::DATE,
    '1 day'::INTERVAL
) AS date_series
WHERE EXTRACT(DOW FROM date_series) IN (0, 6);

Questa query utilizza EXTRACT(DOW FROM date_series), che restituisce il giorno della settimana (0 per domenica, 6 per sabato), filtrando i risultati per includere solo i weekend.

3. Generare Date per una Campagna Promozionale

Se una promozione dura una settimana con offerte giornaliere:

SELECT generate_series(
    '2025-02-10'::DATE, 
    '2025-02-16'::DATE, 
    '1 day'::INTERVAL
);

Restituisce tutte le date dal 10 al 16 febbraio 2025.

Conclusione

Generare date in SQL con PostgreSQL è semplice grazie a generate_series, CURRENT_DATE, date_trunc e altre funzioni. Questi metodi sono utili per report, analisi temporali e gestione di intervalli di date. Con gli esempi pratici visti, puoi applicare queste tecniche nei tuoi progetti per automatizzare operazioni legate alle date e migliorare l’efficienza delle query. Per ulteriori informazioni potete leggere la documentazione ufficiale PostgreSQL official documentation.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Torna in alto