【问题标题】:Sequelize query - compare dates in two columnsSequelize 查询 - 比较两列中的日期
【发布时间】:2019-06-28 00:25:17
【问题描述】:

我在 Sequelize 中有一个带有两个日期列的表格 - 即带有:

var Visit = sequelize.define("Visit", {
  /*...*/
  scheduleEndDate: {
    type: DataTypes.DATE
  }
  actualEndDate: {
    type: DataTypes.DATE
  }
  /*...*/
});

我想做一个查询,返回实际结束日期在 scheduleEndDate 之前的行 - 并且无法获得正确的格式。我对findAll 查询的where 部分的尝试是:

where: { actualEndDate: { lt: Visit.scheduleEndDate } }

- 由于未定义访问而引发错误(也尝试使用 this.scheduleEndDate - 也会引发错误)

where: { actualEndDate: '< scheduleEndDate' }

- 将 actualEndDate 与字符串 '

我是否需要定义一个实例方法来进行日期比较/如何最好地解决?

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    这应该可以用

    where: { actualEndDate: { $lt: sequelize.col('scheduleEndDate') } }
    

    【讨论】:

    • 是的——行得通。已删除我的错误回复。谢谢。
    • 您能解释一下为什么这样做吗?我很难看到创建列对象如何有助于比较日期。谢谢!
    • $lt 转换为运算符 (&lt;) - 以 $ 为前缀的任何内容都是 sequelize 中的运算符($lte、$in、$contains 等),sequelize.col 允许您参考一列。如果你这样做$lt: scheduleEndDate,scheduleEndDate 将被转义为字符串文字
    • 啊,这完全有道理。感谢您的洞察力!
    【解决方案2】:

    在最新版本 (v5) 中,您需要使用 Sequelize.OpDocs

    const Op = Sequelize.Op;
    ...
    where: {
        actualEndDate: {
            [Op.lt]: sequelize.col('scheduleEndDate')
        }
    }
    

    所有操作:

    Project.findAll({
      where: {
        id: {
          [Op.and]: {a: 5},           // AND (a = 5)
          [Op.or]: [{a: 5}, {a: 6}],  // (a = 5 OR a = 6)
          [Op.gt]: 6,                // id > 6
          [Op.gte]: 6,               // id >= 6
          [Op.lt]: 10,               // id < 10
          [Op.lte]: 10,              // id <= 10
          [Op.ne]: 20,               // id != 20
          [Op.between]: [6, 10],     // BETWEEN 6 AND 10
          [Op.notBetween]: [11, 15], // NOT BETWEEN 11 AND 15
          [Op.in]: [1, 2],           // IN [1, 2]
          [Op.notIn]: [1, 2],        // NOT IN [1, 2]
          [Op.like]: '%hat',         // LIKE '%hat'
          [Op.notLike]: '%hat',       // NOT LIKE '%hat'
          [Op.iLike]: '%hat',         // ILIKE '%hat' (case insensitive)  (PG only)
          [Op.notILike]: '%hat',      // NOT ILIKE '%hat'  (PG only)
          [Op.overlap]: [1, 2],       // && [1, 2] (PG array overlap operator)
          [Op.contains]: [1, 2],      // @> [1, 2] (PG array contains operator)
          [Op.contained]: [1, 2],     // <@ [1, 2] (PG array contained by operator)
          [Op.any]: [2,3]            // ANY ARRAY[2, 3]::INTEGER (PG only)
        },
        status: {
          [Op.not]: false           // status NOT FALSE
        }
      }
    })
    

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多