Nel mondo dei database SQL, PostgreSQL è noto per la sua robustezza e per il ricco set di funzionalità. Una di queste è l'ottimo supporto per i tipi date e timestamp. In questa guida vedremo come formattare le date in PostgreSQL, con tanto di esempi di codice. Questo tutorial è pensato per software engineer e per chiunque abbia una mentalità tecnica e voglia ampliare le proprie conoscenze di PostgreSQL.
Capire le date in PostgreSQL
Prima di vedere come formattare le date, è fondamentale capire come vengono rappresentate in PostgreSQL. PostgreSQL usa il tipo di dato “Date” per memorizzare la data. Ecco come creare una tabella con una colonna DATE.
CREATE TABLE orders (
order_id serial PRIMARY KEY,
order_date DATE NOT NULL
);
Ora inseriamo qualche dato nella tabella orders.
INSERT INTO orders (order_date) VALUES
('2022-04-01'),
('2022-04-02'),
('2022-04-03');
PostgreSQL è intelligente e riesce a ricavare una data da una stringa se la fornisci in formato ISO 6801.
Come formattare le date in PostgreSQL: usare la funzione TO_CHAR
Il metodo principale per formattare le date in PostgreSQL è la funzione TO_CHAR. TO_CHAR ci permette di convertire i tipi data/ora in una stringa con un pattern specifico. Ecco come si usa:
TO_CHAR(date, format)
L'elenco completo delle opzioni di formattazione è disponibile nella documentazione di PostgreSQL. Ecco le opzioni di formattazione aggiornate a gennaio 2024:
| Pattern | Descrizione |
|---|---|
| HH | ora del giorno (01–12) |
| HH12 | ora del giorno (01–12) |
| HH24 | ora del giorno (00–23) |
| MI | minuto (00–59) |
| SS | secondo (00–59) |
| MS | millisecondo (000–999) |
| US | microsecondo (000000–999999) |
| FF1 | decimo di secondo (0–9) |
| FF2 | centesimo di secondo (00–99) |
| FF3 | millisecondo (000–999) |
| FF4 | decimo di millisecondo (0000–9999) |
| FF5 | centesimo di millisecondo (00000–99999) |
| FF6 | microsecondo (000000–999999) |
| SSSS, SSSSS | secondi dalla mezzanotte (0–86399) |
| AM, am, PM o pm | indicatore antimeridiano/pomeridiano (senza punti) |
| A.M., a.m., P.M. o p.m. | indicatore antimeridiano/pomeridiano (con punti) |
| Y,YYY | anno (4 o più cifre) con virgola |
| YYYY | anno (4 o più cifre) |
| YYY | ultime 3 cifre dell'anno |
| YY | ultime 2 cifre dell'anno |
| Y | ultima cifra dell'anno |
| IYYY | anno con numerazione settimanale ISO 8601 (4 o più cifre) |
| IYY | ultime 3 cifre dell'anno con numerazione settimanale ISO 8601 |
| IY | ultime 2 cifre dell'anno con numerazione settimanale ISO 8601 |
| I | ultima cifra dell'anno con numerazione settimanale ISO 8601 |
| BC, bc, AD o ad | indicatore di era (senza punti) |
| B.C., b.c., A.D. o a.d. | indicatore di era (con punti) |
| MONTH | nome completo del mese in maiuscolo (riempito con spazi fino a 9 caratteri) |
| Month | nome completo del mese con iniziale maiuscola (riempito con spazi fino a 9 caratteri) |
| month | nome completo del mese in minuscolo (riempito con spazi fino a 9 caratteri) |
| MON | nome abbreviato del mese in maiuscolo (3 caratteri in inglese, la lunghezza varia con la lingua) |
| Mon | nome abbreviato del mese con iniziale maiuscola (3 caratteri in inglese, la lunghezza varia con la lingua) |
| mon | nome abbreviato del mese in minuscolo (3 caratteri in inglese, la lunghezza varia con la lingua) |
| MM | numero del mese (01–12) |
| DAY | nome completo del giorno in maiuscolo (riempito con spazi fino a 9 caratteri) |
| Day | nome completo del giorno con iniziale maiuscola (riempito con spazi fino a 9 caratteri) |
| day | nome completo del giorno in minuscolo (riempito con spazi fino a 9 caratteri) |
| DY | nome abbreviato del giorno in maiuscolo (3 caratteri in inglese, la lunghezza varia con la lingua) |
| Dy | nome abbreviato del giorno con iniziale maiuscola (3 caratteri in inglese, la lunghezza varia con la lingua) |
| dy | nome abbreviato del giorno in minuscolo (3 caratteri in inglese, la lunghezza varia con la lingua) |
| DDD | giorno dell'anno (001–366) |
| IDDD | giorno dell'anno con numerazione settimanale ISO 8601 (001–371; il giorno 1 dell'anno è il lunedì della prima settimana ISO) |
| DD | giorno del mese (01–31) |
| D | giorno della settimana, da domenica (1) a sabato (7) |
| ID | giorno della settimana ISO 8601, da lunedì (1) a domenica (7) |
| W | settimana del mese (1–5) (la prima settimana inizia il primo giorno del mese) |
| WW | numero della settimana dell'anno (1–53) (la prima settimana inizia il primo giorno dell'anno) |
| IW | numero della settimana dell'anno con numerazione settimanale ISO 8601 (01–53; il primo giovedì dell'anno cade nella settimana 1) |
| CC | secolo (2 cifre) (il ventunesimo secolo inizia il 2001-01-01) |
| J | Data giuliana (giorni interi dal 24 novembre 4714 a.C. a mezzanotte locale; vedi Sezione B.7) |
| Q | trimestre |
| RM | mese in numeri romani maiuscoli (I–XII; I=gennaio) |
| rm | mese in numeri romani minuscoli (i–xii; i=gennaio) |
| TZ | abbreviazione del fuso orario in maiuscolo (supportata solo in to_char) |
| tz | abbreviazione del fuso orario in minuscolo (supportata solo in to_char) |
| TZH | ore del fuso orario |
| TZM | minuti del fuso orario |
| OF | scostamento del fuso orario da UTC (supportato solo in to_char) |
Esempi di formattazione delle date
Iniziamo convertendo la nostra data in una stringa semplice e leggibile. Ecco come fare:
SELECT order_id, TO_CHAR(order_date, 'DD Mon YYYY') as formatted_date
FROM orders;
L'output sarà simile a questo:
order_id | formatted_date
———+—————-
1 | 13 Jan 2024
2 | 12 Jan 2024
3 | 11 Jan 2024
4 | 10 Jan 2024
5 | 09 Jan 2024
Possiamo anche estrarre solo una parte della data:
SELECT order_id, TO_CHAR(order_date, 'Day') as day_of_week
FROM orders;
order_id | day_of_week
———+————-
1 | Friday
2 | Thursday
3 | Wednesday
4 | Tuesday
5 | Monday
Possiamo persino combinare più formati, se vogliamo:
SELECT order_id, TO_CHAR(order_date, 'Day, DD Mon YYYY') as detailed_date
FROM orders;
order_id | detailed_date
———+————————
1 | Friday, 13 Jan 2024
2 | Thursday, 12 Jan 2024
3 | Wednesday, 11 Jan 2024
4 | Tuesday, 10 Jan 2024
5 | Monday, 09 Jan 2024
La funzione EXTRACT
La funzione EXTRACT offre un accesso semplice a tutte le possibili parti di un valore data/ora, come anno, mese, giorno, ecc.
SELECT order_id, EXTRACT(MONTH from order_date) as order_month
FROM orders;
order_id | order_month
———+————
1 | 1
2 | 1
3 | 1
4 | 1
5 | 1
Queste sono le basi della formattazione delle date in PostgreSQL. Questi strumenti dovrebbero darti solide fondamenta per gestire i dati di tipo data. Come per tutto nella programmazione, la pratica è fondamentale: prova questi comandi in prima persona e scopri cos'altro riesci a inventarti. Buon coding!
Dovresti proprio provare a eseguire queste query in Beekeeper Studio. :-)
Beekeeper Studio è una GUI per database gratuita & open source
Il miglior strumento per query & editor SQL che abbia mai usato. Offre tutto ciò che mi serve per gestire il mio database. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio è veloce, intuitivo e facile da usare. Beekeeper supporta tantissimi database e funziona alla grande su Windows, Mac e Linux.
Cosa dicono gli utenti di Beekeeper Studio
"Beekeeper Studio ha sostituito completamente il mio vecchio workflow SQL. È veloce, intuitivo e rende di nuovo piacevole lavorare con i database."
"Ho provato molte GUI per database, ma Beekeeper trova il perfetto equilibrio tra funzionalità e semplicità. Funziona e basta."