关于postgresql:Now()没有时区

Now() without timezone

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

我该如何解决这个问题?


1
SELECT now()::TIMESTAMP

这就是全部。转换将时间戳转换为时区的当前时间戳。这也是标准SQL函数LOCALTIMESTAMP在Postgres中实现的方式。

如果你不在多个时区工作,那就没问题。否则,对于added_at,切换到timestamptz。区别是什么?

  • 在Rails和PostgreSQL中完全忽略时区


嗯,你可以做如下的事情:

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

不知道这对于"添加"一列有什么意义。您几乎总是想要一个绝对时间戳(带有时区的时间戳)而不是浮动时间戳。

编辑对以下点的响应:

  • 是的,应该将时间戳与时区(绝对时间)结合使用,除非您有充分的理由不这样做。

  • 客户时区由SHOW TimeZonecurrent_setting(...)给出,如上图所示。

  • 确实需要一些时间来浏览手册——它们很好地涵盖了所有这些内容。


    "当前日期/时间":

    CURRENT_TIME and CURRENT_TIMESTAMP deliver values with time zone; LOCALTIME and LOCALTIMESTAMP deliver values without time zone.