能否在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
相关产品推荐
相关产品推荐

