使用UTC中的当前时间作为PostgreSQL中的默认值

我有一个TIMESTAMP WITHOUT TIME ZONEtypes的列,并希望将该默认值设置为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... 

一个function甚至不需要。 只需在默认expression式的周围放置圆括号:

 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 

如果你的其他时间戳没有时区,那么这个时间会产生当前时间的匹配types“没有时区的时间戳”。

不过,我想看看别人怎么看待这个select。 我仍然不相信我对这个“有/没有”时区的理解。