加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL date()与时区

发布时间:2020-12-13 16:41:41 所属栏目:百科 来源:网络整理
导读:我有一个问题从Postgres正确选择日期 – 他们正在以UTC存储,但是 不能正确地使用Date()函数进行转换。 将时间戳转换为日期会导致错误的日期,如果它是PST太多下午4点。 在这种情况下2012-06-21应该是2012-06-20。 starts_at列数据类型是没有时区的时间戳。
我有一个问题从Postgres正确选择日期 – 他们正在以UTC存储,但是
不能正确地使用Date()函数进行转换。

将时间戳转换为日期会导致错误的日期,如果它是PST太多下午4点。

在这种情况下2012-06-21应该是2012-06-20。

starts_at列数据类型是没有时区的时间戳。这是我的查询:

没有转换到PST时区:

Select starts_at from schedules where id = 40;

      starts_at      
---------------------
 2012-06-21 01:00:00

转换给出了这一点:

Select (starts_at at time zone 'pst') from schedules where id = 40;
        timezone        
------------------------
 2012-06-21 02:00:00-07

但是不能将时区转换为正确的日期。

在您的问题中,我没有看到starts_at的确切类型。你真的应该包括这个信息,这是解决方案的关键。我必须猜测

基本上,PostgreSQL总是在时间段内存储时间戳的UTC时间值。只有显示因当前时区设置而异。 AT TIME ZONE构造的效果也随基础数据类型而变化。 this related answer更多细节。

如果从timestamp [without time zone]类型中提取日期,则可以获取当前时区的日期。输出中的日期与显示时间戳值相同。

如果从timestamp with time zone类型(简称为timestamptz)中提取日期,则首先“应用”时区偏移。您仍然可以获取当前时区的日期,这与时间戳的显示一致。同样的时间点在欧洲的部分地区,例如在加利福尼亚州的下午4点。要获取某个时区的日期,请首先应用AT TIME ZONE。

因此,你在这个问题的顶部所描述的内容与你的例子相矛盾。

给定starts_at是时间戳[无时区],服务器上的时间设置为本地时间。测试与:

SELECT now();

它与墙上的时钟同时显示吗?如果是,您当前会话的时区设置与您当地的时区一致。如果否,您可能需要访问postgresql.conf中的时区设置。或者你的客户端可以做什么呢? (可以每个会话设置。)Details in the manual.

从start_at获取当地的日期

SELECT starts_at::date

重要的是:

SELECT date(starts_at)

BTW,您当地的时间现在是UTC-7,而不是UTC-8,因为夏令时是有效的(不是在人类的更明亮的想法之中)。

太平洋标准时间(PST)通常比UTC(通用时区)早8小时,但在夏令时期间(如现在)为7小时。这就是为什么timestamptz在你的例子中显示为2012-06-21 02:00:00-07。 AT TIME ZONE’PST’的结构考虑到夏令时。这两个表达式产生不同的结果(一个在冬天,一个在夏天),并且可能导致不同的日期:

SELECT '2012-06-21 01:00:00'::timestamp AT TIME ZONE 'PST','2012-12-21 01:00:00'::timestamp AT TIME ZONE 'PST'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读