PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

in postgres, puoi impostare la formattazione predefinita per un timestamp, per sessione o globalmente?

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