Next.js + PrismaでDatetime型をwhereする


基本的にはこれでOK。

const data = await prisma.post.findMany({
  where: {
    createdAt: {
      gte: new Date('2022-01-01'),
      lt: new Date('2022-01-02'),
    },
  },
})

こちらのIssueにもありますが、ISOフォーマットの日付のみサポートしているみたいです。

dey.jsでやるならこんな感じですかね。

const now = dayjs()

const data = await prisma.post.findMany({
  where: {
    createdAt: {
      gte: now.startOf('month').toISOString(),
      lt: now.endOf('month').toISOString(),
    },
  },
})

あと、Next.jsでgetServerSidePropsとかで値を取得してPropsとして渡そうとしている場合は、以下のように、JSONにシリアライズできるデータを返してくださいと怒られます。

`object` ("[object Date]") cannot be serialized as JSON. Please only return JSON serializable data types.

なので、こんな感じで一旦Parseしてreturnしてあげるとうまくいきます。

export const getServerSideProps: GetServerSideProps = async () => {
  const now = dayjs()

  const data = await prisma.post.findMany({
    where: {
      createdAt: {
        gte: now.startOf('month').toISOString(),
        lt: now.endOf('month').toISOString(),
      },
    },
  })

  const posts = JSON.parse(JSON.stringify(data))

  return {
    props: { posts },
  }
}

Prisma楽しい。