【问题标题】:Sequelize Query to find all records that falls in between date rangeSequelize Query 查找日期范围内的所有记录
【发布时间】:2021-12-28 15:48:13
【问题描述】:

我有一个带有列的模型:

from: { type: Sequelize.DATE }
to: { type: Sequelize.DATE }

我想查询fromto在日期范围之间的所有记录:[startDate, endDate]

试过类似的东西:

const where = {
    $or: [{
        from: {
            $lte: startDate,
            $gte: endDate,
        },
        to: {
            $lte: startDate,
            $gte: endDate,
        },
    }],
};

类似的东西:

SELECT * from MyTable WHERE (startDate <= from <= endDate) OR (startDate <= to <= endDate

【问题讨论】:

  • 有什么问题?你有什么错误吗?该查询生成的 SQL 是什么?
  • 这是因为您的查询错误。 from: { $gte: startDate, $lte:endDate }

标签: mysql sequelize.js


【解决方案1】:

对我有用的解决方案是:-

// here startDate and endDate are Date objects
const where = {
    from: {
        $between: [startDate, endDate]
    }
};

更多关于运营商的参考:-http://docs.sequelizejs.com/en/latest/docs/querying/#operators

注意:MYSQLbetween比较运算符是inclusive,这意味着它等价于表达式(startDate &lt;= from AND from &lt;= endDate)

【讨论】:

  • $between 是边界独占吗?是否包括from === startDate || from === endDate
  • @ShankarRegmi Between MYSQL 中的比较是 inclusive 。更多dev.mysql.com/doc/refman/5.7/en/…
【解决方案2】:

试试这个条件,我认为你所要求的会这样做。

对于新版本的 Sequelize:

const where = {
    [Op.or]: [{
        from: {
            [Op.between]: [startDate, endDate]
        }
    }, {
        to: {
            [Op.between]: [startDate, endDate]
        }
    }]
};

OR 作为您的代码结构:

const where = {
    $or: [{
        from: {
            $between: [startDate, endDate]
        }
    }, {
        to: {
            $between: [startDate, endDate]
        }
    }]
};

欲了解更多信息,您可以关注此Sequelize official documents

【讨论】:

  • 为什么需要开始和结束日期来表示 from 和 to 位置?
  • @CecilRodriguez 需要检查是否在这些日期之间找到了来自单独两个字段的任何日期。他还在问题中特别提出了这一要求。
【解决方案3】:

步骤 - 1 需要 SEQUELIZE 的操作

const { Op } = require('sequelize');

步骤 - 2 声明两个常量:

const startedDate = new Date("2020-12-12 00:00:00");
const endDate = new Date("2020-12-26 00:00:00");

步骤 - 3

table.findAll({where : {"fieldOfYourDate" : {[Op.between] : [startedDate , endDate ]}}})
.then((result) =>  res.status(200).json({data : result}))
.catch((error) =>  res.status(404).json({errorInfo: error}))

【讨论】:

  • 它给出了Types of property '[Op.between]' are incompatible. 错误,下面一个解决了这个问题stackoverflow.com/a/60987727/5134215 放在这里以防万一有人试图解决同样的问题
【解决方案4】:

我同意@VigneshSundaramoorthy 的评论,即即使[Op.between] 使用日期字符串,类型定义也表明这种用法不受官方支持。该操作需要 数字 数组,并且至少截至 2021 年 12 月 28 日,文档没有将 Op.between 用于日期范围的示例(仅适用于数字范围)。

但是,我们可以通过类型兼容的方式实现相同的结果,这也符合 Sequelize 文档:

const where = {
  "date_field": {
    [Op.and]: {
      [Op.gte]: startOfDateRange,
      [Op.lte]: endOfDateRange
    }
  }
}

这还具有更明确的优势(即搜索是包容性的)而不是依赖于BETWEEN 的方言行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2023-03-26
    • 2021-01-29
    • 1970-01-01
    • 2018-07-01
    • 2021-08-22
    相关资源
    最近更新 更多