Il mondo dei database e quello del frontend spesso non vanno d'accordo su come dovrebbero apparire le date. PostgreSQL può salvare le date come DATE, TIMESTAMP o anche TIMESTAMPTZ, ma questo formato non è sempre quello giusto per mostrarlo all’utente. Per esempio, invece del classico 2023-10-01 12:30:45, i designer potrebbero voler vedere 01 ottobre 2023, 12:30. E a volte serve formattare la data per report o API.
Per convertire le date in formato stringa e viceversa in PostgreSQL ci sono le funzioni TO_CHAR() e TO_DATE().
Funzione TO_CHAR()
TO_CHAR() è il tuo migliore amico quando devi trasformare dati temporali in un formato stringa leggibile. Prende una data o un timestamp e la formatta secondo il formato che scegli tu.
Sintassi
TO_CHAR(value, format)
value— la data o il timestamp che vuoi convertire.format— la stringa con il template di formato, cioè come vuoi che venga mostrata la data.
Esempi di formati
| Template di formato | Significato | Esempio |
|---|---|---|
YYYY |
Anno | 2023 |
MM |
Mese (numero da 01 a 12) | 10 |
MONTH |
Nome del mese (maiuscolo) | OCTOBER |
DAY |
Giorno della settimana (maiuscolo) | SUNDAY |
DD |
Giorno del mese | 01 |
HH24 |
Ore in formato 24h | 15 |
MI |
Minuti | 45 |
SS |
Secondi | 30 |
La lista completa dei formati la trovi nella documentazione ufficiale di PostgreSQL.
Esempi di utilizzo di TO_CHAR()
Formattare una data per un report
SELECT TO_CHAR(NOW(), 'DD.MM.YYYY') AS formatted_date;
-- Risultato: '09.10.2023'
Mostrare l’ora in formato 12h
SELECT TO_CHAR(NOW(), 'HH12:MI AM') AS formatted_time;
-- Risultato: '03:45 PM'
Mostrare il mese in lettere
SELECT TO_CHAR(NOW(), 'Month') AS month_name;
-- Risultato: 'October '
Attenzione: PostgreSQL aggiunge uno spazio alla fine. È una feature, non un bug! Se vuoi togliere gli spazi, usa la funzione TRIM():
SELECT TRIM(TO_CHAR(NOW(), 'Month')) AS trimmed_month_name;
Creare un formato custom
SELECT TO_CHAR(NOW(), 'YYYY/MM/DD HH24:MI:SS') AS custom_format;
-- Risultato: '2023/10/09 15:45:30'
Formattare per l’interfaccia utente
SELECT TO_CHAR(NOW(), 'DD "ottobre" YYYY anno') AS user_friendly_date;
-- Risultato: '09 ottobre 2023 anno'
Funzione TO_DATE()
TO_DATE() fa il contrario: prende una stringa e la trasforma in tipo DATE. Perché serve? Per esempio, l’utente può inserire una data nel formato 01-10-2023, e PostgreSQL deve “capire” che data è.
Sintassi
TO_DATE(value, format)
value— la stringa che contiene la data.format— la stringa con il template che descrive il formato della stringa.
Esempi di utilizzo di TO_DATE()
Convertire una stringa in data
SELECT TO_DATE('01-10-2023', 'DD-MM-YYYY') AS date_value;
-- Risultato: '2023-10-01' (tipo: DATE)
Confrontare una data stringa con una data in tabella
Supponiamo di avere una tabella appointments con una colonna appointment_date di tipo DATE. L’utente inserisce la data come stringa:
SELECT *
FROM appointments
WHERE appointment_date = TO_DATE('2023-10-09', 'YYYY-MM-DD');
Formato sbagliato
Attenzione: se il formato della stringa non corrisponde al template, avrai un errore! Per esempio:
SELECT TO_DATE('01/10/2023', 'DD-MM-YYYY');
-- Errore: formato di input non valido
Validare i dati inseriti dall’utente
Supponiamo di creare una tabella per salvare ordini, dove la data viene inserita dall’utente:
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
order_date DATE
);
-- Inserimento dati con conversione da stringa a data
INSERT INTO orders (order_date)
VALUES (TO_DATE('10-09-2023', 'MM-DD-YYYY'));
Esempi pratici
Formattare un report. Nella tabella sales viene salvata la data di vendita nella colonna sale_date (tipo TIMESTAMP). Serve mostrare un report dove le date sono nel formato DD.MM.YYYY.
-- Esempio dati
CREATE TABLE sales (
sale_id SERIAL PRIMARY KEY,
sale_date TIMESTAMP
);
INSERT INTO sales (sale_date)
VALUES
('2023-10-01 15:30:00'),
('2023-10-02 10:15:00'),
('2023-10-03 12:45:00');
-- Report
SELECT sale_id,
TO_CHAR(sale_date, 'DD.MM.YYYY') AS formatted_date
FROM sales;
Conversione dei dati inseriti dall’utente. Supponiamo che l’utente inserisca la data in formato stringa MM/DD/YYYY. Bisogna convertirla in DATE per salvarla nel sistema.
INSERT INTO sales (sale_date)
VALUES (TO_TIMESTAMP('10/01/2023 15:30:00', 'MM/DD/YYYY HH24:MI:SS'));
Errori tipici e consigli
Formato sbagliato. Spesso capita che il formato della stringa non corrisponde al template. Per esempio, se l’utente inserisce la data come 01-10-2023, ma il formato è MM/DD/YYYY, PostgreSQL darà errore. Consiglio: valida sempre l’input dell’utente prima di passarlo in SQL.
Spazi nei formati TO_CHAR(). Alcuni formati, tipo MONTH, aggiungono spazi. Se ti dà fastidio, usa la funzione TRIM().
Errori nel parsing delle stringhe. Se la stringa contiene caratteri strani o un formato inaspettato, PostgreSQL non riuscirà a convertirla. Consiglio: usa espressioni regolari o controlli extra prima di inserire i dati nel database.
Uso sbagliato dei formati orari. Per esempio, provare a gestire un TIMESTAMP con un template pensato per DATE. Consiglio: assicurati che i tipi di dato che usi siano quelli giusti per il tuo caso.
Le funzioni TO_CHAR() e TO_DATE() ti danno un sacco di possibilità per lavorare con i dati temporali. Puoi creare formati comodi per i report, convertire input degli utenti e rendere le tue query SQL più leggibili. Nella vita reale queste funzioni sono usatissime per visualizzare dati, creare report, integrare altri sistemi e preparare interfacce utente.
GO TO FULL VERSION