我有一个TIMESTAMP WITHOUT TIME ZONE
类型的列,并希望将其默认为 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...
甚至不需要函数。只需在默认表达式周围加上括号:
create temporary table test(
id int,
ts timestamp without time zone default (now() at time zone 'utc')
);
另一种解决方案:
timezone('utc', now())
将其包装在一个函数中:
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
如果您的其他时间戳没有时区,则此强制转换将产生当前时间的匹配类型“时间戳没有时区”。
我想阅读别人对这个选项的看法。我仍然不相信我对这个“有 / 没有”时区内容的理解。
编辑:在这里添加 Michael Ekoka 的评论,因为它澄清了一个重要的观点:
警告。问题是关于在 UTC 中为不存储时区的时间戳列生成默认时间戳 (可能是因为如果您知道所有时间戳共享相同,则不需要存储时区)。您的解决方案是生成本地时间戳 (对于大多数人来说,不一定会设置为 UTC) 并将其存储为朴素的时间戳 (未指定其时区的时间戳)。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(39条)