In PostgreSQL, la formattazione dei timestamp è indipendente dall'archiviazione. Una risposta è usare to_char
e formatta il timestamp in qualsiasi formato ti serva nel momento in cui ne hai 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 devi impostare la formattazione predefinita:
Modifica il formato del timestamp postgresql a livello globale:
Dai un'occhiata al tuo fuso orario, esegui questo come una query sql:
show timezone
Result: "US/Eastern"
Quindi, quando stampi current_timestamp, vedi questo:
select current_timestamp
Result: 2012-10-23 20:58:35.422282-04
Il -04
alla fine è il tuo fuso orario relativo all'UTC. Puoi cambiare il tuo fuso orario con:
set timezone = 'US/Pacific'
Quindi:
select current_timestamp
Result: 2012-10-23 18:00:38.773296-07
Quindi nota il -07
lì, ciò significa che il Pacifico è a 7 ore dall'UTC. Come faccio a far sparire quell'antiestetico fuso orario? Un modo è solo quello di creare una tabella, per impostazione predefinita è un timestamp senza fuso orario:
CREATE TABLE worse_than_fail_table
(
mykey INT unique not null,
fail_date TIMESTAMP not null
);
Quindi se aggiungi un timestamp a quella tabella e seleziona da essa
select fail_date from worse_than_fail_table
Result: 2012-10-23 21:09:39.335146
yay, nessun fuso orario alla fine. Ma vuoi un maggiore controllo su come viene visualizzato il timestamp per impostazione predefinita! Potresti fare qualcosa del genere:
CREATE TABLE moo (
key int PRIMARY KEY,
boo text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
È un campo di testo che ti dà un maggiore controllo su come viene visualizzato per impostazione predefinita quando esegui un select somecolumns from sometable
. Nota che puoi trasmettere una stringa al timestamp:
select '2012-10-11 12:13:14.56789'::timestamp
Result: 2012-10-11 12:13:14.56789
Puoi trasmettere un current_timestamp a timestamp
che rimuove il fuso orario:
select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047
Puoi sbarazzarti 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 indietro il fuso orario puoi farlo:
select current_timestamp::timestamp with time zone
Result: 2012-10-23 21:20:21.256478-04
Puoi estrarre ciò che vuoi con extract:
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