Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用日期续写Where语句_Javascript_Node.js_Sequelize.js - Fatal编程技术网

Javascript 用日期续写Where语句

Javascript 用日期续写Where语句,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我使用sequelize作为我的后端ORM。现在我想做一些关于日期的where操作 更具体地说,我想获得所有数据,其中日期是从现在开始,7天之后 问题是文档没有指定可以对Datatypes.DATE执行哪些操作 有人能给我指出正确的方向吗?就像Molda说的,你可以用$gt,$lt,$gte或$lte加上日期: model.findAll({ where: { start_datetime: { $gte: moment().subtract(7, 'days').toD

我使用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中导入运算符符号并像这样使用

const { Op } = require('sequelize')

model.findAll({
  where: {
    start_datetime: {
      [Op.gte]: moment().subtract(7, 'days').toDate()
    }
  }
})
根据文件,出于安全原因,这被认为是最佳做法

有关更多信息,请参阅

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

(……)

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


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

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

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

此解决方案没有
moment.js

从7天前到现在 从现在到7天后 注:

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

  • 那么您是否尝试过$lt:(新日期())和$gt:(…)替换。。。随着时间的推移,现在-7天来堆栈溢出!为了进一步提高答案的质量,请记住,其他网站的链接可能会变得不可用,因此强烈建议您将外部文档中的相关信息复制为答案正文中的引文。这是我的问题。谢谢。这是Sequelize的新标准。请注意,这在Sequelize 5中不起作用。。。由于基于字符串的运算符不安全,您可以从Sequelize中查看中断更改。。您应该按照其他注释使用[Op.gte]如果您只是导入dbHI,而不是使用矩().subtract(7,'days').toDate(),我需要使用列名createdDate。有可能吗?在\“7d \”或其附近有一个警告语法错误。可能是您的双
    都已转义吗?
    const sevenDaysAgo = new Date(new Date().setDate(new Date().getDate() - 7));
    models.instagram.findAll({
      where: {
        my_date: {
          $gt: sevenDaysAgo,
          $lt: new Date(),
        },
      },
    });
    
    const sevenDaysFromNow = new Date(new Date().setDate(new Date().getDate() + 7));
    models.instagram.findAll({
      where: {
        my_date: {
          $gt: new Date(),
          $lt: sevenDaysFromNow,
        },
      },
    });