用日期续写 Where 语句

Sequelize Where statement with date

我正在使用 Sequelize 作为我的后端 ORM。现在我想对日期进行一些 WHERE 操作。

更具体地说,我想获取日期从现在到 7 天前的所有数据。

问题是文档没有指定您可以在 Datatypes.DATE

上执行哪些操作

谁能指出我正确的方向?

正如 Molda 所说,您可以将 $gt$lt$gte$lte 与日期一起使用:

model.findAll({
  where: {
    start_datetime: {
      $gte: moment().subtract(7, 'days').toDate()
    }
  }
})

如果您使用的是 Sequelize v5,则必须包含 Op,因为密钥已移至 Symbol

const { Op } = require('sequelize')

model.findAll({
  where: {
    start_datetime: {
      [Op.gte]: moment().subtract(7, 'days').toDate()
    }
  }
})

查看更多sequelize documentation here

我不得不从 sequelize 中导入运算符符号并像这样使用。

const { Op } = require('sequelize')

model.findAll({
  where: {
    start_datetime: {
      [Op.gte]: moment().subtract(7, 'days').toDate()
    }
  }
})

根据文档,出于安全原因,这被认为是最佳做法。

有关详细信息,请参阅 http://docs.sequelizejs.com/manual/tutorial/querying.html

Using Sequelize without any aliases improves security. Some frameworks automatically parse user input into js objects and if you fail to sanitize your input it might be possible to inject an Object with string operators to Sequelize.

(...)

For better security it is highly advised to use Sequelize.Op and not depend on any string alias at all. You can limit alias your application will need by setting operatorsAliases option, remember to sanitize user input especially when you are directly passing them to Sequelize methods.

您还可以使用 Sequelize.literal() 在 SQL 中执行日期操作。

以下代码适用于 Postgres,但我很确定在其他系统中也可以完成类似的操作:

model.findAll({
  where: {
    start_datetime: {
      $gte: Sequelize.literal('NOW() - INTERVAL \'7d\''),
    }
  }
})

此解决方案没有 moment.js 库。

7天前到现在

const sevenDaysAgo = new Date(new Date().setDate(new Date().getDate() - 7));
models.instagram.findAll({
  where: {
    my_date: {
      $gt: sevenDaysAgo,
      $lt: new Date(),
    },
  },
});

从现在到 7 天后

const sevenDaysFromNow = new Date(new Date().setDate(new Date().getDate() + 7));
models.instagram.findAll({
  where: {
    my_date: {
      $gt: new Date(),
      $lt: sevenDaysFromNow,
    },
  },
});

备注:

  • $gt 代表“大于”。您可以使用 $gte 而不是 $gt$gte 代表“大于或等于”。 $lte 当然也一样。
  • 从技术上讲,您需要 $lt$gt 来确保日期不在未来(根据原始问题)。
  • 其他答案显示使用 [Sequelize.Op.gt] 而不是 $gt。如果在 Sequelize v5 上使用它。