【问题标题】:Wrong date display when using "date" data type in postgres在 postgres 中使用“日期”数据类型时显示错误的日期
【发布时间】:2017-09-17 13:57:17
【问题描述】:

有些表使用“日期”数据类型。在旧系统(psql 9.1/PHP5.3)中,当日期存储在数据库中时,它是正确存储的。但是,在新系统(psql 9.6/PHP 7.1)中,日期存储不正确。例如,在旧系统中存储 7/13/10 时,会存储以下内容:

stage_date |      to_timestamp
------------+------------------------
1279004400 | 2010-07-13 00:00:00-07

当在新系统中存储相同的日期时,它会存储以下内容:

 stage_date |      to_timestamp
------------+------------------------
 1278979200 | 2010-07-12 17:00:00-07

两个操作系统都设置为“America/Los_Angeles”。旧数据库设置为使用“本地时间”(在 9.1 中将使用系统时区)。新数据库使用“PDT”。

什么会导致旧系统中的值设置为“1279004400”与新系统中的“1278979200”?

部分表定义:

    Column    |           Type      
--------------+---------------------
 id           | integer             
 stage_date   | date                

【问题讨论】:

  • 您的客户使用什么时区?.. show time zone
  • 客户端使用PDT。
  • 我建议使用timestamptz 以避免与时区混淆,但如果可以的话,您可能会这样做
  • 我不明白。值 1279004400 不是 date 数据类型的合法值。
  • 函数 extract(epoch from stage_date) as stage_date 用于将日期从“2010-07-13”转换为 1279004400。

标签: php postgresql date types


【解决方案1】:

万一其他人在这里结束:表格视图正在使用提取函数将日期转换为纪元。 extract 的行为在 PostgreSQL 版本 9.2 中发生了变化。

此更改恢复了在 7.3 版中进行的考虑不周的更改。 从 UTC 午夜开始的测量结果不一致,因为它使 结果取决于时区设置,其计算为 不应该没有时区的时间戳。之前的行为 通过将输入值转换为带时间的时间戳来保持可用 区域。

有关详细信息,请参阅以下问题的答案: Different results for extract epoch on different PostgreSQL servers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多