CodeGym /Corsi /SQL SELF /Conversione dei formati data

Conversione dei formati data

SQL SELF
Livello 31 , Lezione 3
Disponibile

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.

2
Compito
SQL SELF, livello 31, lezione 3
Bloccato
Formattazione della data corrente
Formattazione della data corrente
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION