PostgreSQL:如何按用户提交的原始值插入datetime?
解决Prisma+PostgreSQL特定表保留原始datetime值的问题
1. 修改目标表的字段类型为无时区时间戳
在你的Prisma Schema中,给目标表的datetime字段添加@db.Timestamp(withoutTimeZone)注解,强制数据库以无时区模式存储该字段,避免自动转换服务器时区:
model Activity { id Int @id @default(autoincrement()) name String datetime DateTime @db.Timestamp(withoutTimeZone) // 指定无时区存储 }
执行迁移命令更新数据库结构:
prisma migrate dev
2. 存储时直接传入原始时间字符串
避免将前端传入的时间转为Date对象(Date对象会携带本地/服务器时区信息,触发自动转换),直接传递前端提交的原始时间字符串:
// 示例:后端处理前端请求 async function createActivity(req) { const { name, datetime } = req.body; await prisma.activity.create({ data: { name, datetime // 直接传入原始字符串,如"2022-12-01 01:00:00" } }); }
3. 验证结果
查询数据时,确认返回的datetime值与前端提交的原始值完全一致:
const activity = await prisma.activity.findFirst({ where: { name: "Play Football" } }); console.log(activity.datetime); // 应输出与前端提交一致的时间值
注意事项
- 其他表的
datetime字段保持默认配置(默认使用TIMESTAMP WITH TIME ZONE),不会受此修改影响。 - 确保前端提交的时间格式符合PostgreSQL无时区时间的要求(如
YYYY-MM-DD HH:MM:SS),避免解析错误。
内容的提问来源于stack exchange,提问作者Teknoville
相关产品推荐
相关产品推荐

