Now()没有时区

时间:2013-12-28 07:21:10

标签: postgresql timestamp postgresql-9.2

我有added_at类型的列timestamp without time zone。我希望它的默认值是当前的日期时间但没有时区。函数now()也返回时区。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:63)

SELECT now()::timestamp

这就是全部。演员表将时间戳转换为您时区的当前时间戳。这也是Postgres中standard SQL function LOCALTIMESTAMP的实现方式。

如果您不在多个时区操作,那就可以了。否则切换到timestamptz added_at。差异?

答案 1 :(得分:34)

你可以这样做:

SELECT now() AT TIME ZONE current_setting('TimeZone');
SELECT now() AT TIME ZONE 'Europe/Paris';
SELECT now() AT TIME ZONE 'UTC';

不确定这对于“added_at”列有什么意义。您几乎总是希望绝对时间戳(带时区的时间戳)不是浮动时间戳。


编辑回复以下几点:

  1. 是的,应该使用带时区的时间戳(绝对时间),除非你有充分的理由不这样做。

  2. 客户时区由SHOW TimeZonecurrent_setting(...)提供,如上所示。

  3. 请花点时间浏览一下手册 - 它们很好地涵盖了所有这些内容。

答案 2 :(得分:17)

"Current Date/Time"

  

CURRENT_TIME和CURRENT_TIMESTAMP提供带时区的值; LOCALTIME和LOCALTIMESTAMP提供没有时区的值。

答案 3 :(得分:0)

2020年的新答案和本机答案

在PostgreSQL中,如果您只需要当前日期时间,请致电CURRENT_TIMESTAMP() 不带时区,并在秒字段中输入小数位数秒字段的小数点?

(在PostgreSQL v12.4上测试)

然后使用此:

SELECT CURRENT_TIMESTAMP(0)::TIMESTAMP WITHOUT TIME ZONE;

如果您将列的数据类型定义为timestamp(而不是timestamptz),则可以存储不带时区的时间戳,在这种情况下,不要忽略 >添加TIMESTAMP WITHOUT TIME ZONE

赞:

CREATE TABLE foo (created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP(0))

在上述函数中,传递了 0 以除去秒字段中的小数位数。