【发布时间】:2020-02-04 23:20:52
【问题描述】:
我尝试在主机上使用 TypeORM 和 Postgres 部署 JS 应用程序。在本地,我有一个 Postgress 数据库,所以在我自己的 TZ 中运行。远程主机恰好将其系统时间设置为 UTC:
$ date
Mon Oct 7 15:45:00 UTC 2019
$ psql
> select localtimestamp;
2019-10-07 15:45:00.123456
我有一个表格,里面有一个自动更新的日期(这意味着它会在记录更新时更新)。
// my.entity.ts
@UpdateDateColumn({type: 'timestamp', name: 'lastUpdate', default: () => 'LOCALTIMESTAMP' })
lastUpdate: Date;
在 CEST 12:00 插入一行:
> select "lastUpdate" from myTable;
2019-10-07 10:00:00.000000+00
无论服务器时间如何,我都想在我的时区 (CEST) 中获取日期,因此它应该返回 2019-10-07 12:00。我不想硬编码任何技巧,因为它也应该在我的 CEST 机器上工作。
Postgress 拥有所有信息:
> show timezone;
UCT
- 它知道它在 UTC 时间运行
- 我可以告诉它我想要哪个时区的日期
所以我希望将其转换为我要求的格式很容易。但是,我发现的以下示例似乎不起作用:
> select ("lastUpdate" at time zone 'CEST') from myTable;
2019-10-07 08:00:00.000000+00
> select timezone('CEST', "lastUpdate") from myTable;
2019-10-07 08:00:00.000000+00
有一种方法可以让我正确,那就是指定当前时区:
> select ("lastUpdate" at time zone 'UTC' at time zone 'CEST') from myTable;
2019-10-07 12:00:00.000000
但是,就像我说的那样,我不想硬编码(因为其他数据库在其他 TZ 上运行)并且 Postgres 知道它自己的时区。
是否有其他语法可以正确执行此操作?
【问题讨论】:
-
也许您应该尝试只使用
timestamptz类型而不是有时使用timestamp类型。尝试将默认设置为now()。你的专栏是什么类型的? -
无论如何,
select '2019-10-07 10:00:00.000000+00' at time zone 'CEST';对我来说很好用..(输出:2019-10-07 12:00:00) -
如果您对类型和
AT TIME ZONE运算符感到困惑,文档可能会有所帮助:postgresql.org/docs/current/… -
由于
"lastUpdate"和("lastUpdate" at time zone 'CEST')在您给定的示例中都有一个时区,我想它有问题。
标签: postgresql nestjs typeorm