我有一个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...
答案 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)
(在以下代码中,应将'UTC'
替换为区域,将now()
替换为时间戳)
timestamp AT TIME ZONE zone
-符合SQL标准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
。答案 5 :(得分:1)
该功能已存在: 时区('UTC':: text,now())