У меня есть столбец TIMESTAMP WITHOUT TIME ZONE
типа и хотел бы, чтобы по умолчанию текущее время в UTC. Узнать текущее время в UTC очень просто:
postgres=# select now() at time zone 'utc';
timezone
----------------------------
2013-05-17 12:52:51.337466
(1 row)
Как использовать текущую метку времени для столбца:
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...
postgresql
timezone
timestamp
Вичерт Аккерман
источник
источник
ALTER TABLE testcase_result ADD COLUMN date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT (NOW() AT TIME ZONE "UTC") NOT NULL;
терпит неудачу с:ERROR: column "UTC" does not exist
. Убедитесь, что'utc'
все строчные.'utc'
Строка также должна быть в одинарных, а не в двойных кавычках.Еще одно решение:
источник
Оберните это в функцию:
источник
Что о
Если ваша другая временная метка не имеет часового пояса, тогда это приведение даст соответствующий тип «временная метка без часового пояса» для текущего времени.
Я хотел бы прочитать, что другие думают об этом варианте, хотя. Я все еще не верю в мое понимание этого "с / без" материала о часовом поясе.
РЕДАКТИРОВАТЬ: Добавление комментария Майкла Экока здесь, потому что он проясняет важный момент:
источник
Это 2 эквивалентных решения:
(в следующем коде, вы должны заменить
'UTC'
на зоны иnow()
для временной метки )timestamp AT TIME ZONE zone
- Соответствие стандарту SQLtimezone(zone, timestamp)
- возможно, более читаемыйОбъяснение:
'UTC'
), либо как интервал (например,INTERVAL '-08:00'
) - вот список всех доступных часовых поясовnow()
возвращает значение типа timestamp (именно то, что нам нужно) с прикрепленным к вашей базе данных часовым поясом по умолчанию (например2018-11-11T12:07:22.3+05:00
).timezone('UTC', now())
превращает наше текущее время (типа отметка времени с часовым поясом ) в эквивалент времени без времени вUTC
.Например,
SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC'
вернусь2020-03-16T20:00:00Z
.Документы: часовой пояс ()
источник
at timezone 'utc'
и это не сработало с моей настройкой PostgreSQL. Использование заглавных букв решило проблемуФункция уже существует: часовой пояс ('UTC' :: text, now ())
источник