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

时间:2013-05-17 13:00:50

标签: postgresql timezone timestamp

我有一个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...

6 个答案:

答案 0 :(得分:246)

甚至不需要功能。只需将括号括在默认表达式周围:

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

答案 1 :(得分:27)

还有另一种解决方案:

BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
    total.append(line).append('\n');
}

答案 2 :(得分:24)

将其包裹在一个函数中:

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()
);

答案 3 :(得分:15)

怎么样?
now()::timestamp

如果您的其他时间戳没有时区,那么此演员表将生成匹配类型"时间戳没有时区"目前的时间。

我想了解别人对这个选项的看法。我仍然不相信我对这个"有/无"时区的东西。

编辑: 在此添加Michael Ekoka的评论,因为它澄清了一个重要的观点:

  

买者。问题是关于为UTC生成默认时间戳   碰巧没有存储时区的时间戳列(也许是   因为如果你知道所有的话,就不需要存储时区   你的时间戳分享相同)。你的解决方案是做什么的   生成本地时间戳(对大多数人来说不一定   设置为UTC)并将其存储为一个天真的时间戳(一个没有   指定其时区)。

答案 4 :(得分:2)

这些是2个等效的解决方案:

(在以下代码中,应将'UTC'替换为区域,将now()替换为时间戳

  1. timestamp AT TIME ZONE zone-符合SQL标准
  2. timezone(zone, timestamp)-更具可读性
  

函数timezone(zone,timestamp)等同于符合SQL的构造时间戳AT TIME ZONE区域。


说明:

    可以将
  • 区域指定为文本字符串(例如'UTC')或间隔(例如INTERVAL '-08:00')-这里是{{3 }}
  • 时间戳可以是时间戳
  • 类型的任何值
  • 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

文档:all available time zones

答案 5 :(得分:1)

该功能已存在: 时区('UTC':: text,now())