【问题标题】:stop further date conversion which is already in UTC停止已经在 UTC 中的进一步日期转换
【发布时间】:2022-11-24 02:00:40
【问题描述】:

默认情况下,任何存储在 postgres 中的日期/时间戳都是标准的 UTC。 Postgres 具有 DATE 列类型,它仅存储完整 timestamp 的日期部分。

将 typeorm 用于 postgres 并使用 repositories 时,日期将按原样获取。然而,当您使用这样的原始查询执行某些操作时:

const queryRunner = await this.connection.createQueryRunner();
await queryRunner.connect()
const response = await queryRunner.query('SELECT * FROM MY_VIEW WHERE AGE=23');

对于同一日期(仅)列,我收到类似这样的内容,其值为“1999-01-02”

{
  name: 'mleko',
  age : '23',
  dob : '1999-01-01:T22:00:00:000Z',
  address: 'xyz'
}  

我不确定这种转换到底在哪里发生,可能是 typeorm 使用的底层驱动程序,但是,我如何告诉 typeorm 不要将已经在 UTC 中的日期再次转换为 UTC。

【问题讨论】:

  • 该列的 PostgreSQL 数据类型是什么?
  • @LaurenzAlbe,这只是约会
  • 这只是因为 javascript 具有如此弱的类型系统。 javascript 中没有“日期”类型(称为“日期”但不代表日期),大多数日期/时间库都没有引入。打字稿中可能有一个更成熟的图书馆。
  • @RichardHuxton,您认为有没有解决这个问题的解决方法而不解决不同的 orm?
  • 1)这个“默认情况下,存储在 postgres 中的任何日期/时间戳都是标准的 UTC。”是错的。这仅适用于timestamp with time zone。 2) date 没有时区,所以有些东西将你的日期值变成了时间戳。

标签: postgresql typeorm


【解决方案1】:

所以,我解决这个问题的方法是对原始查询进行转换:

const queryRunner = await this.connection.createQueryRunner();
await queryRunner.connect()
const response = await queryRunner.query('SELECT name, age, dob::VARCHAR, address FROM MY_VIEW WHERE AGE=23');  

这将避免任何转换

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2011-11-06
    • 2016-04-25
    相关资源
    最近更新 更多