Postgres:获取带有最新午夜时区的本地时间戳

4 postgresql timezone

我在欧洲/柏林时区(+02),Postgresql在世界标准时间(+00)运行。我需要获取带有最新本地午夜日期(时区中当前日期的开始日期)的时间戳。

所以如果我们有2013-03-03 14:00:00 + 02,我的最终结果将是这样的

2013-03-03 22:00:00+00
2013-03-04 00:00:00+02 // the same
Run Code Online (Sandbox Code Playgroud)

我试图与这个日期

SELECT TIMESTAMP 'today' AT TIME ZONE 'Europe/Berlin'
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会在00:00和02:00产生错误的日​​期(前一天的午夜),因为UTC时间在前一天仍然处于静止状态,而今天似乎使用utc来计算其余时间。

如果我们在欧洲/柏林有2013-03-03 00:05,这将返回

2013-05-01 22:00:00+00
Run Code Online (Sandbox Code Playgroud)

如果我想要正确的日期,我需要使用

SELECT date_trunc('day', now() AT TIME ZONE 'Europe/Berlin') AT TIME ZONE 'Europe/Berlin';
2013-05-02 22:00:00+00
Run Code Online (Sandbox Code Playgroud)

这是正确的,但是非常难看。

此命令是否有更清洁的变体?

Clo*_*eto 5

使用timestamptz。将tz在年底的含义with time zone

SELECT TIMESTAMPTZ 'today' AT TIME ZONE 'Europe/Berlin'
Run Code Online (Sandbox Code Playgroud)

或者,如果您更明确地喜欢它:

SELECT TIMESTAMP with time zone 'today' AT TIME ZONE 'Europe/Berlin'
Run Code Online (Sandbox Code Playgroud)


Den*_*rdy 2

将其包装在一个函数中:

create function midnight() returns timestamptz as $$
  select date_trunc('day', now() AT TIME ZONE 'Europe/Berlin') AT TIME ZONE 'Europe/Berlin';
$$ language sql;
Run Code Online (Sandbox Code Playgroud)