Использование текущего времени в UTC в качестве значения по умолчанию в PostgreSQL

у меня есть столбец TIMESTAMP WITHOUT TIME ZONE введите и хотел бы иметь это значение по умолчанию для текущего времени в UTC. Получить текущее время в UTC легко:

postgres=# select now() at time zone 'utc';
          timezone          
----------------------------
 2013-05-17 12:52:51.337466
(1 row)

As использует текущую метку времени для столбца:

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)

но это использует местное время. Попытка заставить это UTC приводит к синтаксической ошибке:

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...

5 ответов


функция даже не требуется. Просто поставьте скобки вокруг выражения по умолчанию:

create temporary table test(
    id int, 
    ts timestamp without time zone default (now() at time zone 'utc')
);

оберните его в функцию:

create function now_utc() returns timestamp as $$
  select now() at time zone 'utc';
$$ language sql;

create temporary table test(
  id int,
  ts timestamp without time zone default now_utc()
);

насчет

now()::timestamp

Если ваша другая временная метка без часового пояса, то это приведение даст соответствующий тип "временная метка без часового пояса" для текущего времени.

Я хотел бы прочитать, что другие думают об этом варианте. Я все еще не верю в свое понимание этого" с/без " часового пояса.


еще одно решение:

timezone('utc', now())

функция уже существует: часовой пояс ('UTC':: text, now ())