web-dev-qa-db-ja.com

日付付きのWhereステートメントの続き

バックエンドORMとしてsequelizeを使用しています。今、私はいくつかの日付の操作をしたいと思います。

もっと具体的には、日付が現在から7日前のすべてのデータを取得したいです。

問題は、ドキュメントがDatatypes.DATEで実行できる操作を指定していないことです。

誰かが私を正しい方向に向けることができますか?

29
Marc Rasmussen

Moldaが言うように、$gt$lt$gteまたは$lte日付付き:

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

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オブジェクトに解析し、入力のサニタイズに失敗した場合、文字列演算子を使用してObjectをSequelizeに注入できる場合があります。

(...)

セキュリティを強化するために、Sequelize.Opを使用し、文字列エイリアスにまったく依存しないことを強くお勧めします。 operatorAliasesオプションを設定することで、アプリケーションに必要なエイリアスを制限できます。特に、ユーザー入力をSequelizeメソッドに直接渡す場合は、忘れずにユーザー入力をサニタイズしてください。

37
James Graham

Sequelize.literal()を使用して、SQLで日付操作を実行することもできます。

次のコードはPostgresで動作しますが、他のシステムでも同様のことができると確信しています。

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

0
marcopeg