我在正确 Select Postgres中的日期时遇到了一个问题——它们存储在UTC中,但是

如果时间戳超过太平洋标准时间下午4点,将时间戳转换为日期会给我错误的日期.

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

starts_at列的数据类型是timestamp without time zone.以下是我的疑问:

不转换为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

但两者都不能转换为时区中的正确日期.

推荐答案

在你的问题中,我没有看到exact型的starts_at.你真的应该包括这些信息,这是解决问题的关键.我得猜猜.

PostgreSQL always在内部存储timestamp with time zone类型的UTC时间.输入和输出(显示)调整为当前timezone设置或给定时区.AT TIME ZONE的效果也随基础数据类型而变化.见:

如果从类型timestamp [without time zone]中提取date,则会得到当前时区的日期.输出中的日期将与timestamp值的显示相同.

如果从类型timestamp with time zone(简称timestamptz)中提取date,则首先"应用"时区偏移.您仍然可以获得当前时区的日期,该日期与时间戳的display一致.在欧洲部分地区,同样的时间点也会转化为第二天,比如加利福尼亚州的下午4点多.要获取特定时区的日期,请先申请AT TIME ZONE.

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

假设starts_at101,服务器上的时间设置为本地时间.测试方法:

SELECT now();

它的显示时间和你墙上的时钟一样吗?如果是(并且数据库服务器在正确的时间运行),则当前会话的timezone设置与本地时区一致.如果没有,您可能希望访问postgresql.conf或客户机中的timezone设置.Details in the manual.

请注意,timezone偏移量与时间戳文本中显示的sign偏移量相反.见:

让你的本地约会从starts_at开始

SELECT starts_at::date

相当于:

SELECT date(starts_at)

顺便说一句,你的当地时间现在是UTC-7,而不是UTC-8,因为夏令时是有效的(不属于人类更Illuminate 的 idea ).

太平洋标准时间(PST)通常比UTC(世界时区)早8小时(大于timestamp个值),但在夏时制期间(如现在)可能是7小时.这就是为什么在您的示例中timestamptz显示为2012-06-21 02:00:00103.构造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'

Postgresql相关问答推荐

用于JSON数组的带有组合条件的Postgres JSONB Select 查询

PostgreSQL(container)中使用80K子分区表处理共享内存不足错误

使用函数返回值作为另一个函数的参数

PostgreSQL临时文件的误解

如何通过 DirectFunctionCall 发送 NULL 参数?

Postgres 将分区附加到表的时间太长.想明白为什么

postgres 如何计算多列哈希?

连接 Supbase Postgresql 数据库时,Stepzen Graphiql 资源管理器中的主机名解析错误

转换数组类型

从 Postgres 字段中的多个值中进行 Select

使用 ON CONFLICT 从 INSERT 返回行,无需更新

SELECT INTO 具有多个归因

如何让 Rails 使用 SSL 连接到 PostgreSQL?

是否可以在 Postgres 中存储一个 1 字节的数字?

postgresql:致命:password authentication failed for user "douglas"

如何使用 psql 命令列出、创建、使用和判断数据库?

如何在 plpgsql 中使用记录类型变量?

解释结果中的Recheck Cond是什么意思?

Oracle 相当于 Postgres 的 DISTINCT ON?

以声明方式从 Postgres 字符串中获取最后一个单词