没有时区的Now()


72

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

我该如何解决这个问题?


4
当前日期时间在哪里?在你的桌子上?在服务器上?在您用户的计算机上?没有时区的日期时间没有多大意义。

2
@MikeW在运行它的环境中。
アレックス

考虑使用with timestamp,尤其是当您的代码在使用夏令时的任何地方运行时。或者将时间保存为UTC,而不是本地时区。您可以随时选择要在显示的数据是什么时区。
一些

@some,有什么不同with timezone吗?
2013年

8
你误会了timestamp with time zone。它根本不带有时区。它只是UTC的绝对时间,并且在TimeZone会话变量中与本地时间进行转换。随便用timestamp with time zone; 这几乎总是正确的选择。
Craig Ringer 2013年

Answers:


85
SELECT now()::timestamp;

强制转换将timestamptz返回的转换为您所在时区中now()相应的值timestamp-由timezone会话的设置定义。这也是在Postgres中实现标准SQL函数的LOCALTIMESTAMP方式。

如果您不在多个时区工作,那很好。否则切换到timestamptzadded_at。区别?

顺便说一句,这是完全一样的,只是嘈杂和昂贵:

SELECT now() AT TIME ZONE current_setting('timezone');

select now()::timestamptz;是更好的搭配
Dmitriy Kosolobov

5
@DmitriKosolobov:now()已经返回了timestamptz,因此now()::timestamptz没有任何用处。
Erwin Brandstetter

这在任何方面都比它更好localtimestamp吗?
a_horse_with_no_name

now()::timestamp可能会进行一些转换,但对我而言,它不会从本地时区转换为UTC。但是now() AT TIME ZONE 'UTC';做正确的事。
ThoPaz

1
@ThoPaz:now() AT TIME ZONE 'UTC'返回时区UTC的本地时间。LOCALTIMESTAMPnow()::timestamp返回timezone会话当前设置的本地时间。两件事!当前会话使用时,只会碰巧返回相同的值timezone = 'UTC'
Erwin Brandstetter

46

好吧,您可以执行以下操作:

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

不知道这对于列“ added_at”有什么意义。您几乎总是需要绝对时间戳(带时区的时间戳)而不是浮动时间戳。


编辑以下响应点:

  1. 是的,除非您有充分的理由不应该使用带时区(绝对时间)的时间戳。

  2. 客户端时区由SHOW TimeZone或给出,current_setting(...)如上所示。

请花些时间浏览手册-它们涵盖了所有内容。


可能是。1)我应该将列的类型更改为timestamp with time zone吗?2)我怎么知道运行postgresql的机器的当前时区是什么?
アレックス


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来除去秒字段中的小数位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.