使用UTC中的当前时间作为PostgreSQL中的默认值
我有一个TIMESTAMP WITHOUT TIME ZONE
types的列,并希望将该默认值设置为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。 我仍然不相信我对这个“有/没有”时区的理解。