【问题标题】:Sequelize Where statement with dateSequelize 带有日期的 Where 语句
【发布时间】:2015-06-30 03:47:09
【问题描述】:

我使用 Sequelize 作为我的后端 ORM。现在我想在日期上做一些WHERE 操作。

更具体地说,我想获取日期介于现在和 7 天前之间的所有数据。

问题是文档没有具体说明你可以对Datatypes.DATE进行哪些操作

谁能指出我正确的方向?

【问题讨论】:

  • 那么您是否尝试过 $lt: (new Date ()) 和 $gt : (...) 将 ... 替换为现在的时间 - 7 天

标签: javascript node.js sequelize.js


【解决方案1】:

此解决方案没有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 上使用它。

【讨论】:

  • 谢谢你,我一直在滚动和滚动,希望得到一个非 moment.js 解决方案:) 这需要更多的支持
  • 赞成。似乎没有令人信服的理由使用momentsequelize.org/v5/manual/querying.html 现在给出一个非时刻示例:{ createdAt: { [Op.gt]: new Date(new Date() - 24 * 60 * 60 * 1000) }
【解决方案2】:

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

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

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

【讨论】:

  • 在\"\"7d\"\""处或附近出现警告语法错误
  • 你有双 " 都逃脱了吗?
  • 将 'NOW() 更改为 "NOW() 并以 "(双引号)结尾,然后 \' 可以只是一个 '
【解决方案3】:

正如 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 5...您可以查看 Sequelize 的重大更改,因为基于字符串的运算符不安全..您应该按照 [Op.gte]其他评论
  • 或者db.Sequelize.Op如果你只是导入db
  • 嗨,我需要使用列名 createdDate 而不是使用 moment().subtract(7, 'days').toDate()。这可能吗?
【解决方案4】:

我必须从 sequelize 中导入 Operators 符号并像这样使用。

const { Op } = require('sequelize')

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

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

请参阅http://docs.sequelizejs.com/manual/tutorial/querying.html 了解更多信息。

使用不带任何别名的 Sequelize 可以提高安全性。一些框架 自动将用户输入解析为 js 对象,如果您未能 清理您的输入可能会注入一个对象 用于 Sequelize 的字符串运算符。

(...)

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

【讨论】:

  • 欢迎来到 Stack Overflow!为了进一步提高您的回答质量,请记住,指向其他网站的链接可能会变得不可用,因此强烈建议您从外部文档中复制相关信息作为答案正文中的引用。
  • 这对我来说是个问题。谢谢。
  • 这是 Sequelize 的新标准。
猜你喜欢
  • 2018-10-06
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2015-05-25
  • 1970-01-01
相关资源
最近更新 更多