CodeGym /Corsi /SQL SELF /Funzioni per ottenere la data e l'ora attuali: NOW...

Funzioni per ottenere la data e l'ora attuali: NOW(), CURRENT_DATE, CURRENT_TIME

SQL SELF
Livello 31 , Lezione 1
Disponibile

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() o CURRENT_TIMESTAMP se ti serve l'orario preciso con il fuso orario.
  • Usa CURRENT_DATE se per il tuo caso basta la data (tipo per calcolare età o analizzare eventi di un certo giorno).
  • CURRENT_TIME si 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.

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION