Now() without timezone
我有一个timestamp without time zone型的added_at列。我希望它的默认值是当前日期时间,但没有时区。函数now()也返回时区。
我该如何解决这个问题?
- 当前日期时间在哪里?在你的桌子上?在服务器上?在用户的计算机上?没有时区的约会时间没有什么意义。
- @米克尔在它运行的环境中。
- 考虑使用with timestamp,特别是当代码运行在使用夏令时的任何地方时。或者用UTC而不是本地时区保存时间。您始终可以选择要在哪个时区中显示数据。
- @有些,这和with timezone不同吗?
- @亚历克斯对不起,那是个打字错误。我指的是timestamp with time zone或timestamp(0) with time zone,如果你不想要亚秒精度。
- 你误解了。它根本没有时区。它只是在绝对UTC时间内,在TimeZone会话变量中转换为本地时间或从本地时间转换为本地时间。只需使用timestamp with time zone;它几乎总是正确的选择。
这就是全部。转换将时间戳转换为时区的当前时间戳。这也是标准SQL函数LOCALTIMESTAMP在Postgres中实现的方式。
如果你不在多个时区工作,那就没问题。否则,对于added_at,切换到timestamptz。区别是什么?
- select now()::timestamptz;是一个更好的匹配
- @Dmitrikosolobov:now()已经返回timestamptz,因此now()::timestamptz没有任何有用的功能。
嗯,你可以做如下的事情:
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 TimeZone或current_setting(...)给出,如上图所示。
确实需要一些时间来浏览手册——它们很好地涵盖了所有这些内容。
- 可能是的。1)是否应将列的类型更改为timestamp with time zone?2)我如何知道PostgreSQL运行的机器的当前时区是什么?
"当前日期/时间":
CURRENT_TIME and CURRENT_TIMESTAMP deliver values with time zone; LOCALTIME and LOCALTIMESTAMP deliver values without time zone.