PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

no postgres, você pode definir a formatação padrão para um carimbo de data/hora, por sessão ou globalmente?


No PostgreSQL, a formatação dos timestamps é independente do armazenamento. Uma resposta é usar to_char e formate o carimbo de data/hora para qualquer formato que você precisar no momento em que precisar, assim:
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;

Mas se você precisar definir a formatação padrão:

Alterar o formato de carimbo de data/hora do postgresql globalmente:

Dê uma olhada no seu fuso horário, execute isso como uma consulta sql:
show timezone
Result: "US/Eastern"

Então, quando você está imprimindo current_timestamp, você vê isso:
select current_timestamp
Result: 2012-10-23 20:58:35.422282-04

O -04 no final é o seu fuso horário em relação ao UTC. Você pode alterar seu fuso horário com:
set timezone = 'US/Pacific'

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

Então observe o -07 lá, isso significa que o Pacific está a 7 horas de distância do UTC. Como faço para que esse fuso horário desagradável desapareça? Uma maneira é apenas fazer uma tabela, o padrão é um timestamp sem fuso horário:
CREATE TABLE worse_than_fail_table
(
    mykey          INT unique not null,
    fail_date      TIMESTAMP not null
);

Então, se você adicionar um carimbo de data e hora a essa tabela e selecionar a partir dela
select fail_date from worse_than_fail_table
Result: 2012-10-23 21:09:39.335146

sim, sem fuso horário no final. Mas você quer mais controle sobre como o timestamp aparece por padrão! Você poderia fazer algo assim:
CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);

É um campo de texto que lhe dá mais controle sobre como ele aparece por padrão quando você faz um select somecolumns from sometable . Observe que você pode converter uma string para timestamp:
select '2012-10-11 12:13:14.56789'::timestamp
Result: 2012-10-11 12:13:14.56789

Você pode converter um current_timestamp para timestamp que remove o fuso horário:
select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047

Você pode se livrar do fuso horário assim:
select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"

Mas se você realmente quiser o fuso horário de volta, você pode fazer isso:
select current_timestamp::timestamp with time zone
Result: 2012-10-23 21:20:21.256478-04

Você pode arrancar o que quiser com extrair:
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

E esta monstruosidade:
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST';
Result: 2001-02-16 20:38:40