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

如何在Sequelize原生插入查询中正确保存日期?

解决Sequelize原生查询插入日期格式错误的问题

问题根源

直接把Date对象拼接到SQL字符串时,JavaScript会自动将其转为带英文时区描述的字符串(例如Thu Apr 20 2023 01:43:26 GMT+0530 (India Standard Time)),而PostgreSQL无法识别这种格式的时区标识,因此抛出错误。

可行解决方案

1. 使用Sequelize参数绑定(推荐)

避免直接拼接字符串,通过参数绑定让Sequelize自动处理日期格式,同时规避SQL注入风险:

const d = {
  createdAt: new Date(),
  updatedAt: new Date()
};
const query = `insert into "PRODUCT" ("createdAt", "updatedAt", "PRODUCT_ID", "USER_ID") values (:createdAt, :updatedAt, :productId, :userId)`;
let resp = await sequelize.query(query, {
  raw: true,
  type: sequelize.QueryTypes.INSERT,
  replacements: {
    createdAt: d.createdAt,
    updatedAt: d.updatedAt,
    productId: 1,
    userId: 1
  }
});

2. 手动转换日期为PostgreSQL兼容格式

如果必须手动拼接字符串,可将Date对象转为PostgreSQL能识别的格式:

const formatToPGDate = (date) => {
  // 直接转为ISO格式字符串,PostgreSQL可直接解析
  return date.toISOString();
};

const d = {
  createdAt: formatToPGDate(new Date()),
  updatedAt: formatToPGDate(new Date())
};
const query = `insert into "PRODUCT" ("createdAt", "updatedAt", "PRODUCT_ID", "USER_ID") values ('${d.createdAt}','${d.updatedAt}', 1, 1)`;
let resp = await sequelize.query(query, {
  raw: true,
  type: sequelize.QueryTypes.INSERT,
});

注意:手动拼接字符串存在SQL注入风险,仅在特殊场景下使用。

3. 利用Sequelize内置日期处理工具

调用Sequelize自带的日期序列化方法,直接生成适配PostgreSQL的格式:

const { DataTypes } = require('sequelize');
const getPGFormattedDate = () => DataTypes.DATE.prototype._stringify(new Date(), 'postgres');

const d = {
  createdAt: getPGFormattedDate(),
  updatedAt: getPGFormattedDate()
};
// 后续可结合参数绑定或字符串拼接使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:17:19