Eu tenho uma coluna do TIMESTAMP WITHOUT TIME ZONE
tipo e gostaria de ter esse padrão no horário atual no UTC. É fácil obter a hora atual no UTC:
postgres=# select now() at time zone 'utc';
timezone
----------------------------
2013-05-17 12:52:51.337466
(1 row)
Como está usando o registro de data e hora atual para uma coluna:
postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
ts
----------------------------
2013-05-17 14:54:33.072725
(1 row)
Mas isso usa hora local. Tentar forçar isso ao UTC resulta em um erro de sintaxe:
postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR: syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...
postgresql
timezone
timestamp
Wichert Akkerman
fonte
fonte
ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;
falha com:ERROR: column "UTC" does not exist
. Verifique se'utc'
está tudo em minúsculas.'utc'
sequência também deve ser entre aspas simples, não entre aspas duplas.Ainda outra solução:
fonte
Envolva-o em uma função:
fonte
A respeito
Se o seu outro registro de data e hora estiver sem fuso horário, esse elenco produzirá o tipo correspondente "registro de data e hora sem fuso horário" para o horário atual.
Eu gostaria de ler o que os outros pensam sobre essa opção, no entanto. Ainda não confio na minha compreensão desse material "com / sem" fuso horário.
EDIT: Adicionando o comentário de Michael Ekoka aqui, porque esclarece um ponto importante:
fonte
Estas são 2 soluções equivalentes:
(no código a seguir, você deve substituir
'UTC'
a zona e o carimbonow()
de data e hora )timestamp AT TIME ZONE zone
- em conformidade com o padrão SQLtimezone(zone, timestamp)
- indiscutivelmente mais legívelExplicação:
'UTC'
) ou como um intervalo (por exemplo,INTERVAL '-08:00'
) - aqui está uma lista de todos os fusos horários disponíveisnow()
retorna um valor do tipo timestamp (exatamente o que precisamos) com o fuso horário padrão do seu banco de dados anexado (por exemplo2018-11-11T12:07:22.3+05:00
).timezone('UTC', now())
transforma nosso horário atual (do tipo carimbo de data e hora com fuso horário ) no equivalente em fuso horário emUTC
.Por exemplo,
SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'
retornará2020-03-16T20:00:00Z
.Documentos: fuso horário ()
fonte
at timezone 'utc'
e isso não funcionou com a minha configuração do PostgreSQL. Problema resolvido com letras maiúsculasA função já existe: fuso horário ('UTC' :: text, now ())
fonte