mysql 错误:使用sequelize查询日期类型字段时值无效^6.27.0错误:无效值

x33g5p2x  于 2023-08-02  发布在  Mysql
关注(0)|答案(1)|浏览(151)

我正在做一个express项目,我使用ORM sequelize来保持我的Mysql 8.0模式的数据持久性。我尝试执行一个简单的DELETE查询,其中我查询字段“Indicator_Name”和2020-05-25和2022-12-19之间的两个日期范围,我的模式和查询如下:

const deleteRecordsBetweenDates = async () =>{
    let startDate = new Date("2020-05-25").toJSON().slice(0, 10);
    let finalDate = new Date("2022-12-19").toJSON().slice(0, 10);
    const deleteRecords = await indcds_scheme.destroy({
        where: {
            [Op.and]: [
                {"Nombre_indicador": "Covid 19"}, 
                {[Op.between] : [
                    {Fecha_de_inicio: "2020-05-25"}, 
                    {Fecha_de_inicio: "2022-12-19"}
                ]}
            ]
        } 
    });
    return deleteRecords;
}

   router.delete("/delete", async (req, res) => {
    deleteRecordsBetweenDates()
      .then((result) => {
        console.log(result)
        return res.sendStatus(200)
      })
      .catch((error) => {
        console.log(error)
        return res.sendStatus(500)
      });
  });

字符串
方案:

const indcds_scheme = connection.define(
  "indicador_categoría",
  {
    Id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    Nombre_indicador: Sequelize.DataTypes.STRING,
    Descripción_indicador: Sequelize.DataTypes.INTEGER,
    Valor_de_variable: Sequelize.INTEGER,
    Última_actualización: Sequelize.DATE,
    Fecha_de_inicio: Sequelize.DATEONLY,
    Población_rural: Sequelize.INTEGER,
    Población_urbana: Sequelize.INTEGER,
 },
 {
   freezeTableName: true,
 }
);


我跟着这个问题:https://stackoverflow-com.translate.goog/questions/46390150/sequelize-not-accepting-valid-moment-js-object-in-where-clause/46390179?_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es-419#46390179
将日期转换为有效的mysql日期格式,但仍然存在相同的问题:

let startDate = new Date("2020-05-25").toJSON().slice(0, 10);


x1c 0d1x的数据

mcvgt66p

mcvgt66p1#

这个问题可能与您使用Sequelize的日期范围查询选项或JSON转换的方式有关。
我认为在这种情况下,不需要使用Op.和to合并条件。因为sequelize无论如何都将where对象中的多个键隐式地视为AND操作。因此,您可以直接使用条件数组,而无需显式使用Op.and。此外,可以调整Op.between的用法以包括正确的日期范围。您可以提供一个包含两个日期的数组来表示开始和结束日期,而不是在[Op.between]中指定一个包含两个对象的数组。像这样的事

const startDate = new Date("2020-05-25")
const finalDate = new Date("2022-12-19")

const deleteRecords = await indcds_scheme.destroy({
  where: {
    Nombre_indicador: "Covid 19",
    Fecha_de_inicio: {
      [Op.between]: [startDate, finalDate],
    }
  }
})

字符串
此外,您不需要将日期转换为JSON格式。如果我没有错的话,我相信Sequelize可以正确地处理日期对象。如果这不起作用,您可以尝试使用Op.gte和Op.lte。

where: {
     Nombre_indicador: "Covid 19",
     Fecha_de_inicio: {
       [Op.gte]: startDate,
       [Op.lte]: finalDate,
     },
   }

相关问题