我在欧洲/柏林时区(+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)
这是正确的,但是非常难看。
此命令是否有更清洁的变体?
使用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)
将其包装在一个函数中:
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)
| 归档时间: |
|
| 查看次数: |
3304 次 |
| 最近记录: |