PostgreSQL offre diverse funzioni built-in per lavorare con i valori temporali attuali. Queste funzioni sono utili per cose tipo tracciare automaticamente quando viene creata una riga, fare report basati sulla data di oggi o controllare se un evento è successo in un certo periodo. Vediamo insieme le tre funzioni principali: NOW(), CURRENT_DATE e CURRENT_TIME.
NOW(): ottenere la data e l'ora attuali
La funzione NOW() restituisce la data e l'ora attuali nel formato TIMESTAMP WITH TIME ZONE. Questo vuol dire che il risultato include l'orario preciso considerando il fuso orario del server.
Esempio:
SELECT NOW();
-- Risultato: 2025-05-25 14:30:45.761523+03
Nota che il risultato include:
- la data (
2025-05-25), - l'orario (
14:30:45.761523), - il fuso orario (
+03).
Se non ti serve il fuso orario, puoi convertire esplicitamente il risultato in TIMESTAMP:
SELECT NOW()::TIMESTAMP;
-- Risultato: 2025-05-25 14:30:45.761523
CURRENT_DATE: ottenere la data attuale
La funzione CURRENT_DATE restituisce solo la data attuale senza l'orario. Il tipo di ritorno è DATE.
Esempio:
SELECT CURRENT_DATE;
-- Risultato: 2025-05-25
È comodo usarla quando non ti interessa l'orario, tipo per calcolare età o per raggruppare dati per giorno.
CURRENT_TIME: ottenere l'orario attuale
La funzione CURRENT_TIME restituisce l'orario attuale nel formato TIME WITH TIME ZONE. Se non ti serve il fuso orario, puoi convertire il risultato in TIME.
Esempio:
SELECT CURRENT_TIME;
-- Risultato: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- Risultato: 14:30:45.761523
Esempi di utilizzo delle funzioni
Dai, vediamo qualche esempio pratico dove queste funzioni possono tornare utili.
Compilazione automatica della data di creazione della riga
Quando aggiungiamo righe a una tabella, spesso è comodo salvare automaticamente la data e l'orario di creazione. In PostgreSQL puoi farlo mettendo DEFAULT NOW() quando crei la tabella.
Esempio di creazione tabella:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- momento di creazione della riga
);
Aggiunta di una riga:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
Vediamo il contenuto della tabella:
SELECT * FROM orders;
Risultato:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
Filtrare dati per data
Supponiamo di avere una tabella degli ordini e vogliamo selezionare tutti gli ordini creati oggi. Usiamo la funzione CURRENT_DATE per filtrare:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
Qui usiamo la conversione created_at::DATE per togliere l'orario e lasciare solo la data.
Differenze tra NOW() e CURRENT_TIMESTAMP
A prima vista sembra che NOW() e CURRENT_TIMESTAMP facciano la stessa cosa. In effetti è così. Solo che NOW() arriva da uno standard e CURRENT_TIMESTAMP da un altro.
NOW() — funzione PostgreSQL
La funzione NOW() è una funzione built-in di PostgreSQL che restituisce un valore di tipo TIMESTAMP WITH TIME ZONE (timestamptz). È l'orario attuale del server al momento dell'inizio dell'esecuzione della query SQL.
Esempio:
SELECT NOW();
CURRENT_TIMESTAMP — standard SQL
CURRENT_TIMESTAMP è un'espressione definita dallo standard SQL, e anche lei restituisce TIMESTAMP WITH TIME ZONE in PostgreSQL. In pratica, PostgreSQL implementa CURRENT_TIMESTAMP chiamando la stessa funzione di NOW().
Esempio:
SELECT CURRENT_TIMESTAMP;
Confronto pratico
SELECT NOW(), CURRENT_TIMESTAMP;
Risultato:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
I valori sono uguali perché vengono calcolati nello stesso istante — all'inizio della query.
Usare le funzioni temporali nelle condizioni di filtro
Ora proviamo a scrivere una query che seleziona le righe create negli ultimi 7 giorni. Per questo puoi usare NOW() con le operazioni aritmetiche sulle date:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
Allo stesso modo, se vuoi selezionare gli ordini del mese corrente, puoi usare la funzione DATE_TRUNC() per tagliare l'inizio del mese:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC() è una funzione interessante, ne parlerò meglio tra un paio di lezioni :P
Consigli pratici
- Usa
NOW()oCURRENT_TIMESTAMPse ti serve l'orario preciso con il fuso orario. - Usa
CURRENT_DATEse per il tuo caso basta la data (tipo per calcolare età o analizzare eventi di un certo giorno). CURRENT_TIMEsi usa spesso nei report o nelle interfacce dove è importante mostrare quanto tempo è stato speso su un task.
Nella prossima lezione iniziamo a estrarre parti di date e orari usando le funzioni EXTRACT() e AGE(). Con queste puoi, per esempio, calcolare facilmente l'età di una persona o lavorare con dati per giorno, mese o anno.
GO TO FULL VERSION