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 * 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 * 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 * 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 tochar o todate. 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:


