我有一列added_at
type timestamp without time zone
。我希望它的默认值是当前日期时间,但没有时区。该函数还now()
返回时区。
我该如何解决这个问题?
我有一列added_at
type timestamp without time zone
。我希望它的默认值是当前日期时间,但没有时区。该函数还now()
返回时区。
我该如何解决这个问题?
with timestamp
,尤其是当您的代码在使用夏令时的任何地方运行时。或者将时间保存为UTC,而不是本地时区。您可以随时选择要在显示的数据是什么时区。
with timezone
吗?
timestamp with time zone
。它根本不带有时区。它只是UTC的绝对时间,并且在TimeZone
会话变量中与本地时间进行转换。随便用timestamp with time zone
; 这几乎总是正确的选择。
Answers:
SELECT now()::timestamp;
强制转换将timestamptz
返回的转换为您所在时区中now()
相应的值timestamp
-由timezone
会话的设置定义。这也是在Postgres中实现标准SQL函数的LOCALTIMESTAMP
方式。
如果您不在多个时区工作,那很好。否则切换到timestamptz
了added_at
。区别?
顺便说一句,这是完全一样的,只是嘈杂和昂贵:
SELECT now() AT TIME ZONE current_setting('timezone');
select now()::timestamptz;
是更好的搭配
now()
已经返回了timestamptz
,因此now()::timestamptz
没有任何用处。
localtimestamp
吗?
now()::timestamp
可能会进行一些转换,但对我而言,它不会从本地时区转换为UTC。但是now() AT TIME ZONE 'UTC';
做正确的事。
now() AT TIME ZONE 'UTC'
返回时区UTC的本地时间。LOCALTIMESTAMP
或now()::timestamp
返回timezone
会话当前设置的本地时间。两件事!当前会话使用时,只会碰巧返回相同的值timezone = 'UTC'
。
好吧,您可以执行以下操作:
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(...)
如上所示。
请花些时间浏览手册-它们涵盖了所有内容。
timestamp with time zone
吗?2)我怎么知道运行postgresql的机器的当前时区是什么?
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来除去秒字段中的小数位。