gpt4 book ai didi

javascript - 我们总是可以使用 knex 和 postgres 将日期列作为字符串 (varchar) 获取吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:01:04 26 4
gpt4 key购买 nike

我在 postgres 数据库中有一个类型为 date 的列。它是一个像生日一样的列,它只是一个日期,不需要有时间部分。

当使用 knex 获取此列时,结果是一个 javascript Date 对象。它可能正在执行 new Date(row.birthday),这是发送给客户端的结果。

现在的问题是客户端收到的值是标准的 ISO 8601 格式,带有时间部分和 Z。当客户端尝试从此字符串创建新的 Date 对象时,客户端可能会根据客户端所在的位置获得错误的日期值。

例如:

Date: 2018-06-15
Date sent to client: 2018-06-15T00:00:00Z

Client in +5:00 | Client in -5:00
2018-06-16 05:00:00 | 2018-05-15 10:00:00

如果服务器使用的是 UTC,这很好,我们可以只添加客户端的时区偏移量并获取原始日期,但这感觉有点脆弱,并且在本地开发(不是 UTC)期间会中断。

一个简单的解决方案是将日期部分作为字符串发送给客户端。但这需要在服务器中将日期存储为 varchar,我们不想这样做。我们将失去日期格式约束,并使使用 SQL 进行基于日期的计算变得更加困难。

我们可以在选择列时将列转换为 varchar,但每次获取此表时我们都需要有意识地执行此操作。这也意味着我们需要绕过 ORM(书架)来处理这个表。

有没有一种简单的方法可以在 knex 或 bookshelf 或 postgres 本身中指定一个列需要存储为 date,并具有所有附带的约束,但始终以 的形式获取>varchar?

最佳答案

node-postgres 驱动程序是根据日期列 (https://node-postgres.com/features/types#date-timestamp-timestamptz) 发送的数据实际创建 Date() 对象的部分

使用 postgres,您可以像此处描述的那样修改 node-pg 的类型解析器 https://github.com/brianc/node-pg-types

日期类型类型的 oid 为 1082 可以通过以下查询获取

select typname, oid, typarray from pg_type where typname = 'date' order by oid;

因此要覆盖要作为字符串传递的日期类型,在设置数据库连接之前执行此操作就足够了(我想可以在 knexfile.js 中执行此操作):

var types = require('pg').types;
// override parsing date column to Date()
types.setTypeParser(1082, val => val);

关于javascript - 我们总是可以使用 knex 和 postgres 将日期列作为字符串 (varchar) 获取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50716120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com