我有added_at
类型的列timestamp without time zone
。我希望它的默认值是当前的日期时间但没有时区。函数now()
也返回时区。
我该如何解决这个问题?
答案 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”列有什么意义。您几乎总是希望绝对时间戳(带时区的时间戳)不是浮动时间戳。
编辑回复以下几点:
是的,应该使用带时区的时间戳(绝对时间),除非你有充分的理由不这样做。
客户时区由SHOW TimeZone
或current_setting(...)
提供,如上所示。
请花点时间浏览一下手册 - 它们很好地涵盖了所有这些内容。
答案 2 :(得分:17)
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 以除去秒字段中的小数位数。