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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 04:12:31