Prisma如何在orderBy子句中使用函数进行排序?
在Prisma中按日期差绝对值排序的解决方案
目前Prisma Client的高层查询API(如findMany)不支持在orderBy子句中直接使用自定义函数或算术表达式,你没有遗漏官方文档里的用法——这种写法确实不在当前支持范围内。
要实现“返回最接近指定日期的照片”的需求,有两种可行方案:
方案1:使用原生SQL查询(推荐,性能最优)
通过prisma.$queryRaw执行原生SQL,直接在ORDER BY中使用日期差绝对值函数。注意不同数据库的函数语法略有差异,以下是常见数据库的示例:
PostgreSQL示例
const dayTime = new Date('2025-01-01T00:00:00Z'); const closestPhoto = await prisma.$queryRaw` SELECT * FROM photos WHERE "createdAt" >= ${from} AND "createdAt" <= ${to} ORDER BY ABS(EXTRACT(EPOCH FROM "createdAt" - ${dayTime})) LIMIT 1; `;
MySQL示例
const dayTime = new Date('2025-01-01T00:00:00Z'); const closestPhoto = await prisma.$queryRaw` SELECT * FROM photos WHERE createdAt >= ${from} AND createdAt <= ${to} ORDER BY ABS(TIMESTAMPDIFF(SECOND, createdAt, ${dayTime})) LIMIT 1; `;
方案2:查询后在代码中排序(适合小数据集)
如果符合条件的照片数量不多,可以先查询所有符合时间范围的数据,再在JavaScript中计算时间差绝对值并排序:
const dayTime = new Date('2025-01-01T00:00:00Z'); const photosInRange = await prisma.photos.findMany({ where: { createdAt: { gte: from, lte: to } }, }); // 按日期差绝对值从小到大排序,取第一个即为最接近的照片 const closestPhoto = photosInRange.sort((a, b) => { const diffA = Math.abs(a.createdAt.getTime() - dayTime.getTime()); const diffB = Math.abs(b.createdAt.getTime() - dayTime.getTime()); return diffA - diffB; })[0];
注意:此方案会将所有符合条件的数据加载到内存中,数据量大时性能会明显下降,仅推荐用于小数据集场景。
内容的提问来源于stack exchange,提问作者Petr
相关产品推荐
相关产品推荐

