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

Prisma查询中通过日期输入参数过滤数据的问题

问题解决:传入日期参数无法正确筛选Prisma数据

问题原因

JSON本身不支持原生Date类型,通过tRPC传递日期参数时,前端的Date对象会被序列化为ISO格式的字符串。虽然Zod的z.date()类型标注为Date,但实际接收的参数可能是字符串,导致Prisma无法正确识别并执行日期筛选逻辑。

解决方案

方案1:用Zod强制转换日期类型

将z.date()替换为z.coerce.date(),它会自动把传入的ISO字符串(或其他可解析的日期格式)转换为原生Date对象,无需手动处理:

appReqscreated24H: protectedProcedure
  .input(
    z.object({
      startDate: z.coerce.date() // 替换为coerce.date()
    }) 
  )
  .query(async ({ ctx, input }) => {
    return await ctx.prisma.appRequest.count({
      where: {
        created_at: {
          gte: input.startDate
        },
        NOT: {
          status: {
            in: [RequestStatus.COMPLETE]
          }
        }
      }
    })
  }),

方案2:手动转换日期参数

如果不想修改Zod验证规则,可以在查询前手动将输入参数转为Date实例:

appReqscreated24H: protectedProcedure
  .input(
    z.object({
      startDate: z.date()
    }) 
  )
  .query(async ({ ctx, input }) => {
    // 手动转换为Date对象
    const startDate = new Date(input.startDate);
    return await ctx.prisma.appRequest.count({
      where: {
        created_at: {
          gte: startDate
        },
        NOT: {
          status: {
            in: [RequestStatus.COMPLETE]
          }
        }
      }
    })
  }),

额外排查步骤

可以先在query函数中添加日志,确认传入的startDate实际类型:

.query(async ({ ctx, input }) => {
  console.log("startDate类型:", typeof input.startDate);
  console.log("startDate值:", input.startDate);
  // ... 后续查询代码
})

如果输出类型为string,则说明确实是序列化导致的问题,使用上述方案即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:00:54