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

能否在Prisma中无需原生查询调用DATE函数并转换指定SQL?

Prisma无原生查询实现日期函数调用及SQL转换

能不能不用原生查询调用DATE类函数?

可以,Prisma内置了不少日期/时间相关的API,像日期差值计算、日期格式化、聚合类的日期函数都能直接用,不用写原生SQL。不过要是碰到某些数据库特有的冷门日期函数,可能还是得靠原生查询,但你用到的这些函数完全可以用Prisma内置方法搞定。

目标SQL的Prisma转换

先修正下原SQL的语法错误(缺了括号和逗号),正确的SQL应该是:

SELECT
  EXTRACT(DAY FROM MAX(joindate) - CURRENT_DATE) AS DateDifference,
  TO_CHAR(date_of_implementation, 'Mon') as "name",
  SUM("cost_saved") as "savings" 
FROM tracker_info

下面是对应的Prisma查询代码:

带分组的场景(原SQL隐含分组逻辑)

const result = await prisma.tracker_info.aggregate({
  // 聚合函数:取joindate的最大值、cost_saved的总和
  _max: {
    joindate: true,
  },
  _sum: {
    cost_saved: true,
  },
  // 按date_of_implementation分组,对应SQL的GROUP BY逻辑
  _groupBy: {
    date_of_implementation: true,
  },
  // 计算自定义字段
  _compute: {
    // 计算MAX(joindate)和当前日期的天数差,对应EXTRACT(DAY ...)
    DateDifference: {
      dateDiff: {
        start: new Date(), // 对应CURRENT_DATE
        end: { max: 'joindate' },
        unit: 'day',
      },
    },
    // 把日期格式化为缩写月份名,对应TO_CHAR的'Mon'
    name: {
      formatDateTime: {
        date: 'date_of_implementation',
        format: 'MMM', // Prisma用MMM表示缩写月份,和SQL的Mon效果一致
      },
    },
  },
});

无分组的全局聚合场景

如果原SQL不需要分组(直接查全局的聚合值),那得调整非聚合字段的处理方式(Prisma要求非聚合字段必须用聚合操作),比如取第一条记录的月份名:

const result = await prisma.tracker_info.aggregate({
  _max: {
    joindate: true,
  },
  _sum: {
    cost_saved: true,
  },
  _compute: {
    DateDifference: {
      dateDiff: {
        start: new Date(),
        end: { max: 'joindate' },
        unit: 'day',
      },
    },
    name: {
      // 取第一条记录的月份名,可根据需求调整
      take: {
        date_of_implementation: {
          formatDateTime: 'MMM',
        },
        skip: 0,
      },
    },
  },
});

内容的提问来源于stack exchange,提问作者Teknoville

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:54:18