【问题标题】:PostgreSQL date value changes to next day after 5 PM PSTPostgreSQL 日期值更改为太平洋标准时间下午 5 点之后的第二天
【发布时间】:2021-02-18 16:03:27
【问题描述】:

每当我在太平洋标准时间下午 5 点(太平洋标准时间)之后创建数据时,manufactured_date 列就会更改为下一个日期。

例如,我今天在5:15 pm PST 输入了新数据2020-11-05,则存储在manufactured_date 列中的值是2020-10-06

查询select * from cars 给出以下结果

id | car_name | manufactured_date
---------------------------------
1  | Audi     | 11-06-2020
2  | BMW      | 11-06-2020

这里是cars表的属性

column name       | data type
-----------------------------
id                | serial
car_name          | varchar
manufactured_date | date

insert 查询是

insert
    into
    cars (car_name, manufactured_date)
values ('Audi', '11-05-2020');

我怎样才能消除这个问题?

【问题讨论】:

  • 请包含您用于输入日期值的 INSERT/UPDATE 语句。
  • @JonathanJacobson 用插入语句更新了问题。
  • cars 表上是否有一个触发器正在触及manufactured_date 字段?在 psql 中 SHOW timezone 返回什么?

标签: sql postgresql date datetime


【解决方案1】:

使用case 表达式:

select (case when (now() now() at time zone 'PST')::time >= '17:00:00'::time
             then manufactured_date + interval '1 day'
             else manufactured_date
        end)

【讨论】:

  • 问题在于,date 值(在manufactured_date 列中)被存储为明天的日期而不是今天的日期
【解决方案2】:

问题很可能是服务器在 UTC 中运行,即列基于 UTC 而不是 PST 时区。

要验证这一点,你可以执行它,它应该根据服务器时区返回当前时间戳:

select now()

【讨论】:

  • 这是有道理的。无论时区如何,我们都可以存储date 值吗?就我而言,manufactured_date 列。这样日期就不会增加到明天的日期。
  • 插入新值时如何设置manufactured_date?
  • 我正在使用 moment.js 获取当前日期并将其格式化为 MM-DD-YYYY 字符串。
  • 我想在格式化之前你应该将时区转换为 PST,即在 Postgres 中你可以使用select now(),now() AT time zone 'PST';
  • 您是否检查过 Postgres 日志以查看日期字符串是否实际上只是 MM-DD_YYYY 并且它没有与时区一起发送?
【解决方案3】:

这真的很有趣!即使在使用操作系统时区设置和 PGTZ 环境变量之后,我也无法在我的 VM 上重现您的问题。

您能否尝试不依赖隐式数据类型转换?在当前字符串文字之前添加 DATE 指令可能会有所帮助:

INSERT INTO cars (car_name, manufactured_date)
VALUES ('Audi', DATE '2020-11-05');

【讨论】:

  • 我实际上是在使用 API 插入数据。在那,我使用 moment.js 来获取当前日期并将该日期格式化为MM-DD-YYYY
  • P.S.可能是因为您编写日期字符串表示的方式。始终使用 ISO 格式 YYYY-MM-DD
  • 那么它是绑定变量还是动态构建 SQL?
  • 我什至尝试使用YYYY-MM-DD 它仍然给出相同的结果。 (明天的日期)
  • 动态构建SQL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2012-05-05
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多