使用Prisma+MySQL日期查询报错:期望ISO-8601格式DateTime
问题原因与解决方案
核心原因
Prisma 客户端对 DateTime 类型的查询参数有严格格式校验,必须遵循 ISO-8601 标准格式(例如 YYYY-MM-DDTHH:mm:ss)。你使用的 yyyy-MM-dd HH:mm:ss 格式里的空格属于无效字符,不符合Prisma的校验规则,因此直接触发报错。
而MySQL终端能正常执行是因为MySQL自身的SQL解析器兼容多种日期输入格式,但Prisma作为ORM,会在发送请求到数据库前完成参数校验,不通过则直接终止请求。
解决方案
1. 直接传入JavaScript Date对象(推荐)
无需手动格式化日期,Prisma会自动将Date对象转换为符合要求的ISO-8601格式字符串:
const startDate = new Date('2023-07-01'); const endDate = new Date('2024-06-30'); const result = await prisma.yourModel.groupBy({ by: ['targetField'], where: { createdAt: { gte: startDate, lte: endDate } }, // 其他groupBy配置(如_count、_sum等) });
2. 将字符串转换为ISO-8601格式
如果必须使用字符串参数,把日期字符串中的空格替换为T即可:
// 手动替换方式 const formattedStart = '2023-07-01 00:00:00'.replace(' ', 'T'); const formattedEnd = '2024-06-30 00:00:00'.replace(' ', 'T'); // 用日期库生成(以dayjs为例) import dayjs from 'dayjs'; const formattedStart = dayjs('2023-07-01').format('YYYY-MM-DDTHH:mm:ss'); const formattedEnd = dayjs('2024-06-30').format('YYYY-MM-DDTHH:mm:ss');
修改后再传入Prisma的groupBy查询条件,即可正常执行。
内容的提问来源于stack exchange,提问作者Page COW
相关产品推荐
相关产品推荐

