Javascript 和 PostgreSQL 之间的 Drizzle ORM 日期转换问题?

Drizzle ORM date conversion problem between Javascript and PostgreSQL?

提问人:Janne 提问时间:10/9/2023 更新时间:10/11/2023 访问量:364

问:

前提条件:我的时区是 GMT+3

我有一个模型毛毛雨模型

export const events = pgTable('events', {
    id: serial('id').primaryKey(),
    name: varchar('name', {length: 256}).notNull(),
    date: date('date').notNull(),
});

我已将记录插入数据库

# insert into events (name, date) values ('Foobar', '2023-03-30');

当我查询它时,它在结果关系中正确显示

 id |  name   |    date
----+---------+------------
100 | Foobar  | 2023-03-30

现在,如果我运行以下代码

const foo = await db.query.events.findFirst({
    where: eq(events.id, 100),
});
console.log(foo.date);

我得到

2023-03-30T00:00:00.000Z

但是,如果我通过 drizzle-kit Studio 查看数据库,它会显示日期为

2023-03-29T21:00:00.000Z

而且,如果我在另一个查询中使用 foo 的日期值

await db.query.events.findFirst({
    where: lt(events.date, foo.date),
    orderBy: desc(races.date),
});

我得到的记录与我在 foo 中已有的记录相同,而不是日期更早的记录 - 可能是因为我的过滤器值是 2023-03-30,但数据库认为它是 2023-03-29。我的分析是,lt(小于)比较苹果和橙子。但我不明白为什么?我应该怎么做才能解决它?

我是否需要将数据库的时区设置为 UTC,如果设置为 UTC,如何设置?或者有其他方法可以解决这个问题?

PostgreSQL ORM 时区 UTC 毛雨

评论

0赞 Adrian Klaver 10/10/2023
1)(我建议使用另一个名称)字段实际上是Postgres中的一种类型吗?2) Postgres 中的回报是什么?将答案添加为问题的文本更新datedateshow timezone;
0赞 Janne 10/10/2023
是的,字段的类型是 PostgreSQL - 你是对的,名称可能是其他名称。节目 .我把它改成了UTC。我仍然在毛毛雨套件中看到 -3 小时的时间,并且 lt 查询仍然返回相同的实体。dateshow timezone;Europe/Helsinki
0赞 Adrian Klaver 10/10/2023
然后 Drizzle Studio/Kit 正在某处进行转换。1) A 没有时区: 2) 您显示的值是 a,因此应用了 CAST。您可能希望在 Postgres 中启动日志记录,并查看实际访问数据库的内容。dateselect '2023-10-09'::date; 10/09/2023datetime/timestamp
1赞 Janne 10/10/2023
看起来是这样。我想我在我的场景中找到了解决方案。不太确定发生了什么,但解决方法是将日期列的定义更改为 ,即将模式添加为“日期”。然后它开始正确地对待我的比较。如果我测试正确,更改数据库时区不会改变行为。谢谢@AdrianKlaver。date: date("date", {mode: "date"}).notNull()
1赞 Matt Johnson-Pint 10/11/2023
@Janne - 如果有效,请将其作为答案提供,而不仅仅是评论。Stack Overflow 允许(并鼓励)您回答自己的问题。谢谢。

答:

0赞 Janne 10/11/2023 #1

解决方法是将日期列的定义更改为

date: date("date", {mode: "date"}).notNull()

即将模式添加为

“日期”