我有一列added_attype timestamp without time zone。我希望它的默认值是当前日期时间,但没有时区。该函数还now()返回时区。
我该如何解决这个问题?
我有一列added_attype 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来除去秒字段中的小数位。