如何通过Prisma Client向PostgreSQL传递'YYYY-MM-DD'格式日期?
问题:NestJS + Prisma 中如何正确传递PostgreSQL Date类型字段的值
我有一个使用Prisma的NestJS应用,对应PostgreSQL中的public.Transaction表,表结构如下:
Table "public.Transaction" Column | Type | -------+-------------------+ id | integer | amount | double precision | date | date |
在Prisma中,该表的模型定义如下:
model Transaction { id Int @id @default(autoincrement()) amount Float date DateTime @db.Date }
由于使用PostgreSQL,我需要传递YYYY-MM-DD格式的日期。尝试直接传入字符串格式的日期:
const createdTransaction = await this.prisma.transaction.create({ data: { amount: 3333, date: '2022-11-22', }, });
但出现如下错误:
Argument date: Got invalid value '2022-11-22' on prisma.createOneTransaction. Provided String, expected DateTime.
我知道需要传入Date类型,但JavaScript处理后结果会转为字符串。若使用new Date(2022,11,22),虽然能被Prisma接受,但存储的是带时区的字符串Thu Dec 22 2022 00:00:00 GMT+0100 (Central European Standard Time),不符合PostgreSQL的预期。请问在NestJS中,应该给date字段传入什么值?
解决方案
1. 使用ISO格式字符串创建Date对象
直接用YYYY-MM-DD格式的字符串初始化Date对象,Prisma会自动将其解析为符合PostgreSQL DATE类型要求的值,不会带入时区信息:
const createdTransaction = await this.prisma.transaction.create({ data: { amount: 3333, date: new Date('2022-11-22'), }, });
2. 构造UTC时间的Date对象
如果担心本地时区影响日期准确性,可以用Date.UTC()构造UTC时间的Date对象(注意月份是0-based,10对应11月):
// 构造2022年11月22日的UTC时间 const targetDate = new Date(Date.UTC(2022, 10, 22)); const createdTransaction = await this.prisma.transaction.create({ data: { amount: 3333, date: targetDate, }, });
这种方式创建的Date对象,Prisma存储时会提取正确的日期部分,最终在PostgreSQL中保存为纯日期。
3. 使用Prisma Raw SQL(可选)
如果上述方法都不适用,可以直接通过Prisma的Raw SQL传入字符串格式的日期,让PostgreSQL直接解析:
import { Prisma } from '@prisma/client'; const createdTransaction = await this.prisma.transaction.create({ data: { amount: 3333, date: Prisma.sql`'2022-11-22'`, }, });
内容的提问来源于stack exchange,提问作者AlbertMunichMar
相关产品推荐
相关产品推荐

