如何在Prisma查询中进行类型转换?datetime字段查询求助
解决方案:在Prisma中对Datetime字段做类型转换查询
Prisma客户端本身没有内置的类型转换API,但可以通过结合数据库原生函数实现把datetime字段转为字符串后再匹配查询。以下分常见数据库给出落地方案:
1. PostgreSQL 环境
PostgreSQL使用TO_CHAR函数将datetime类型转为指定格式的字符串,再基于转换后的结果做匹配:
适配你事务查询的示例代码
const input = '12'; // 你的输入值,可能是时间戳或普通字符串 // 构建动态查询条件 const whereCondition = input.match(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/) ? { created_at: { equals: new Date(input) } } // 合法ISO时间戳,直接用日期类型匹配 : { // 用原生SQL把created_at转成字符串,匹配包含输入值的记录 AND: [Prisma.sql`TO_CHAR("created_at", 'YYYY-MM-DD HH24:MI:SS.US') LIKE '%${input}%'`] }; return this.DB.$transaction([ this.User.findMany({ take, skip, where: whereCondition }), this.User.count({ where: whereCondition }) ]);
- 先判断输入是否为合法ISO时间戳,是则直接用
Date类型匹配(Prisma会自动处理与数据库datetime类型的映射) - 非时间戳输入时,
TO_CHAR将created_at转为带毫秒的字符串格式,再用LIKE匹配包含输入值的记录(比如输入'12'会匹配日期中含12的所有记录,如12日、12点等)
2. MySQL 环境
MySQL使用DATE_FORMAT或CAST函数完成datetime到字符串的转换:
示例代码
const input = '12'; const whereCondition = input.match(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/) ? { created_at: { equals: new Date(input) } } : { AND: [Prisma.sql`DATE_FORMAT(created_at, '%Y-%m-%d %H:%i:%s.%f') LIKE '%${input}%'`] }; return this.DB.$transaction([ this.User.findMany({ take, skip, where: whereCondition }), this.User.count({ where: whereCondition }) ]);
如果不需要指定格式,也可以用CAST(created_at AS CHAR)替代DATE_FORMAT完成转换。
3. 关键注意事项
- 输入校验:建议在进入查询前做基础输入校验,避免无效查询请求
- 性能优化:若需频繁执行这类字符串匹配查询,建议给转换后的字段创建函数索引(比如PostgreSQL:
CREATE INDEX idx_created_at_str ON "User" (TO_CHAR("created_at", 'YYYY-MM-DD HH24:MI:SS.US'));),避免全表扫描 - 匹配逻辑调整:如果需求是精确匹配日期的某一部分(比如只匹配日为12),可修改转换格式参数,例如
TO_CHAR("created_at", 'DD') = '12'
内容的提问来源于stack exchange,提问作者Bennison J
相关产品推荐
相关产品推荐

