You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drizzle ORM日期筛选问题:如何类型安全查询PostgreSQL中特定时间范围的记录?

Drizzle ORM日期筛选问题:如何类型安全查询PostgreSQL中特定时间范围的记录?

老哥,我之前也踩过这个坑!你误以为Drizzle的between()只支持整数是不对的,它其实支持所有可比较的类型,包括日期/时间,问题出在类型匹配上,我给你说两种类型安全的解决办法:


方法1:适配现有Schema的字符串模式

你的created字段用了mode: "string",这意味着Drizzle会把数据库的timestamp类型映射为带时区的ISO 8601字符串。所以只要保证startDate和endDate是同格式的字符串,直接用between()就完全没问题:

// 先把日期转成符合要求的ISO字符串(带时区)
const startDate = new Date('2024-01-01T00:00:00Z').toISOString();
const endDate = new Date('2024-01-31T23:59:59Z').toISOString();

// 类型安全的查询,完全保留Drizzle的类型检查
const customers = await db
  .select()
  .from(customers)
  .where(between(customers.created, startDate, endDate));

这个写法会生成和你raw SQL完全一致的BETWEEN语句,但同时能享受到Drizzle的类型推断——返回的customers数组会严格匹配你定义的表结构类型,不会像raw SQL那样丢失类型信息。


方法2:修改Schema为Date对象模式

如果你更习惯直接在代码里用Date对象而不是字符串,可以把created字段的mode改成"date",这样Drizzle会自动把数据库的timestamp映射为JavaScript的Date对象:

// 修改后的Schema
export const customers = pgTable("customers", {
  // ...其他字段
  created: timestamp({ withTimezone: true, mode: "date" }).defaultNow(),
});

// 现在可以直接传入Date对象
const startDate = new Date('2024-01-01');
const endDate = new Date('2024-01-31');

const customers = await db
  .select()
  .from(customers)
  .where(between(customers.created, startDate, endDate));

这种写法更符合JavaScript的习惯,而且同样是类型安全的,Drizzle会自动处理Date对象到数据库timestamp的转换。


为什么之前的写法没生效?

大概率是你传入的startDate/endDate类型和Schema定义的不匹配——比如你传了Date对象,但Schema里是字符串模式,Drizzle的类型检查会阻止这种不匹配的传入(这其实是类型安全的体现!),而不是between()本身不支持日期。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:37:58