Un breve articolo volto a chiarire alcuni aspetti e alcune incomprensioni legate alle date e al "formato" delle date in PostgreSQL.
PostgreSQL è in grado di memorizzare le date a partire dall’anno 4713 A.C. fino al 5874897 D.C., utilizzando il tipo di dato denominato "date
", conforme allo standard SQL92. Ogni campo di tipo date
occupa lo spazio interno di 4 byte. Al fine di poter inserire nel database oppure recuperare dal database campi di tipo data, PostgreSQL definisce un formato di default da utilizzare, tramite il parametro datestyle
all’interno di postgresql.conf
.
Questo parametro è solitamente impostato nel formato standard ISO 8601, che prevede la specifica di date nel formato "AAAA-MM-GG
".
Ecco un estratto dal file di configurazione:
datestyle = 'iso, dmy'
E’ possibile visualizzare il valore del parametro datestyle
anche da riga di comando, aprendo una sessione psql
:
gabriele=> show datestyle;
DateStyle
-----------
ISO, DMY
(1 riga)
Prima di andare avanti, creiamo uno schema ed una tabella per fare degli esempi:
gabriele=> create schema test_data;
CREATE SCHEMA
gabriele=> set search_path to test_data;
gabriele=> create table test_data ( giorno date);
CREATE TABLE
Proviamo ad inserire la data odierna nella tabella test_data, utilizzando la funzione predefinita CURRENT_DATE
:
gabriele=> insert into test_data values (CURRENT_DATE);
INSERT 0 1
gabriele=> SELECT 2ndquadrant_italia_mod.txt 2ndquadrant_italia.txt da_installare_pandoc hdoisajds.sh risultati step2 FROM test_data ;
giorno
------------
2009-05-03
(1 riga)
La cosa veramente utile ed interessante è che il parametro ‘datestyle
‘ può essere reimpostato a livello di sessione. Ad esempio, una applicazione che si connette a PostgreSQL può volere inserire o ricevere dati in un formato diverso dal formato ISO 8601. Ad esempio, è possibile voler "negoziare" i dati nel formato "GG-MM-AAAA
". Come fare?
La cosa è molto semplice. E’ sufficiente impostare lo stile della data a "Postgres, European
", oppure "Postgres, DMY
" (in quanto DMY
è un sinonimo di European
).
gabriele=> set datestyle to 'Postgres, DMY';
SET
gabriele=> SELECT 2ndquadrant_italia_mod.txt 2ndquadrant_italia.txt da_installare_pandoc hdoisajds.sh risultati step2 FROM test_data ;
giorno
------------
03-05-2009
(1 riga)
Se invece del segno meno (‘-‘) come separatore, desideriamo avere la barra (‘/’), possiamo utilizzare il formato SQL
in datestyle
:
gabriele=> set datestyle to 'SQL, DMY';
SET
gabriele=> SELECT 2ndquadrant_italia_mod.txt 2ndquadrant_italia.txt da_installare_pandoc hdoisajds.sh risultati step2 FROM test_data ;
giorno
------------
03/05/2009
(1 riga)
Utilizzando opportunamente la variabile datestyle
è pertanto possibile in molti casi evitare di utilizzare funzioni di formattazione runtime come to_char
o to_date
. Non è possibile utilizzare questa soluzione se intendiamo avere nella stessa query più campi data con più di un formato di visualizzazione.
Per quanto riguarda l’immissione di valori, è opportuno segnalare che Postgres ha un sistema di parsing molto flessibile basato su euristiche e in grado di identificare formati di dati diversi (si veda l’Appendice B referenziata in fondo). Le date in formato ‘ISO 8601’ sono sempre accettate, per quanto riguarda i formati Postgres
e SQL
è necessario seguire la sottodirettiva che specifica l’ordine dei campi (DMY
oppure MDY
– il formato americano).
Infine, alcuni link utili:
This Post Has 0 Comments