Sequelize Where语句与日期

Mar*_*sen 38 javascript node.js sequelize.js

我使用sequelize作为我的后端ORM.现在我想做一些日期操作.

更多Speceficly我想获得所有数据,其中的日期是从现在开始,7天后.

问题是文档没有指定您可以执行哪些操作 Datatypes.DATE

谁能指出我正确的方向?

小智 48

我不得不从sequelize中导入Operators符号并像这样使用.

const { Op } = require('sequelize')

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

根据文档,出于安全原因,这被认为是最佳实践.

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

使用没有任何别名的Sequelize可以提高安全性.一些框架会自动将用户输入解析为js对象,如果您无法清理输入,则可能会将带有字符串运算符的Object注入Sequelize.

(......)

为了更好的安全性,强烈建议使用Sequelize.Op并且完全不依赖于任何字符串别名.您可以通过设置operatorAliases选项来限制应用程序所需的别名,记住清理用户输入,特别是当您直接将它们传递给Sequelize方法时.

  • 欢迎使用Stack Overflow!为了进一步提高答案的质量,请记住,指向其他网站的链接可能会变得不可用,因此强烈建议您从外部文档中复制相关信息作为答案正文中的引文。 (2认同)

Eva*_*oky 39

就像Molda说,你可以使用$gt,$lt,$gte$lte用日期:

model.findAll({
  where: {
    start_datetime: {
      $gte: moment().subtract(7, 'days').toDate()
    }
  }
})
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这在Sequelize 5中将不起作用...由于基于字符串的运算符不安全,您可以从Sequelize中检查重大更改。 (5认同)

mar*_*peg 12

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

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

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

Run Code Online (Sandbox Code Playgroud)


Mic*_*ski 5

该解决方案是没有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(),
    },
  },
});
Run Code Online (Sandbox Code Playgroud)

从现在到 7 天后

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

笔记:

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