2012-01-04 11 views
8

In Postgres, è possibile modificare la maschera di formato predefinita per un timestamp?in postgres, puoi impostare la formattazione predefinita per un timestamp, per sessione o globalmente?

ora ritorna come

2012-01-03 20:27:53.611489 

Vorrei risoluzione al minuto in questo modo:

2012-01-03 20:27 

So che posso fare questo su singole colonne con to_char() as o spogliato giù con un substr() da l'app ricevente, ma averla formattata correttamente inizialmente risparmierebbe molto lavoro e ridurrebbe molti errori.

+0

cui applicazione client stai usando? –

+0

prototipo in php, passaggio a node.js in circa 6 mesi –

+0

Quindi questa sarebbe un'impostazione php da modificare, non un'impostazione Postgres. –

risposta

4

In postgres, è possibile cambiare la maschera di formato predefinita per data/ora - utilizzando l'opzione set datestyle; le opzioni disponibili possono essere trovate here (vedere 8.5.2 Uscita Data/Ora).

Sfortunatamente, tutte le opzioni disponibili includono il numero di secondi: sarà quindi necessario riformattarle nella query o nel codice dell'applicazione (se applicabile).

+0

stai trovando quello che ho trovato - grazie –

3

to_char() viene utilizzato per creare una stringa letterale. Se si desidera un diverso valore di timestamp , uso:

date_trunc('minute', now()) 

Per un ingresso mascherare è possibile utilizzare:

to_timestamp('2012-01-03 20:27:53.611489', 'YYYY-MM-DD HH24:MI') 

Fusioni a timestamp without time zone aggiungendo ::timestamp.

Per quanto ne so, non c'è l'impostazione in PostgreSQL che taglierà per difetto i secondi dai valori letterali di data e ora.

+0

grazie, ma il problema non è il valore del timestamp, ma piuttosto la sua rappresentazione di stringa quando selezionato. in questa app, un timestamp presentato all'utente viene sempre arrotondato al minuto più vicino - che ha a che fare con il display, non con i dati. stava cercando un modo per farlo senza un 'to_char()' su ogni colonna di ogni selezione. –

+1

@ccyoung: Se vuoi ** arrotondare ** al minuto più vicino, 'to_char()' connot ti aiuta. Puoi solo troncare con esso. Ad ogni modo, sembra un lavoro per il ** client **, non per il database. a_horse_with_no_name è sulla strada giusta. –

+0

in teoria sono sicuro che probabilmente hai ragione, ma come pratica praticamente hanno messo sempre la formattazione della data e l'aritmetica in SQL, dal momento che è molto meglio rispetto a javascript o php. –

8

In PostgreSQL, la formattazione dei timestamp è indipendente dalla memoria. Una risposta è quella di utilizzare to_char e formattare il timestamp a qualsiasi formato che vi serve in questo momento avete bisogno, in questo modo:

select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS'); 

select to_timestamp('2012-10-11 12:13:14.123', 
    'yyyy-MM-dd HH24:MI:SS.MS')::timestamp; 

Ma se è necessario impostare la formattazione predefinita:

Cambiare il timestamp PostgreSQL formato a livello globale:

Date un'occhiata al vostro fuso orario, eseguire questo come una query SQL:

show timezone 
Result: "US/Eastern" 

Così, quando si stampa fuori CURRENT_TIMESTAMP, si vede questo:

select current_timestamp 
Result: 2012-10-23 20:58:35.422282-04 

Il -04 alla fine è il vostro fuso orario rispetto a UTC.È possibile modificare il fuso orario con:

set timezone = 'US/Pacific' 

Poi:

select current_timestamp 
Result: 2012-10-23 18:00:38.773296-07 

Così notare il -07 lì, questo significa che Pacific è di 7 ore da UTC. Come faccio a far scomparire quell'imprevisto fuso orario? Un modo è solo per fare un tavolo, il valore predefinito è un timestamp senza fuso orario:

CREATE TABLE worse_than_fail_table 
(
    mykey   INT unique not null, 
    fail_date  TIMESTAMP not null 
); 

Poi se si aggiunge un timestamp a quel tavolo e selezionare da esso

select fail_date from worse_than_fail_table 
Result: 2012-10-23 21:09:39.335146 

yay, nessun fuso orario sul fine. Ma vuoi un maggiore controllo su come viene visualizzato il timestamp di default! Si potrebbe fare qualcosa di simile:

CREATE TABLE moo (
    key  int PRIMARY KEY, 
    boo  text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM') 
); 

Si tratta di un campo di testo che vi dà più controllo su come si presenta per impostazione predefinita quando si fa un select somecolumns from sometable. AVVISO si può lanciare una stringa a timestamp:

select '2012-10-11 12:13:14.56789'::timestamp 
Result: 2012-10-11 12:13:14.56789 

potresti lanciare una CURRENT_TIMESTAMP a timestamp che rimuove il fuso orario:

select current_timestamp::timestamp 
Result: 2012-10-23 21:18:05.107047 

Si può sbarazzarsi del fuso orario in questo modo:

select current_timestamp at time zone 'UTC' 
Result: "2012-10-24 01:40:10.543251" 

Ma se vuoi davvero tornare indietro nel fuso orario, puoi farlo:

select current_timestamp::timestamp with time zone 
Result: 2012-10-23 21:20:21.256478-04 

Si può tirare fuori ciò che si vuole con estratto:

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); 
Result: 20 

E questa mostruosità:

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST'; 
Result: 2001-02-16 20:38:40 
Problemi correlati