Formato delle date in PostgreSQL

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

Leave A Reply