簡體   English   中英

Sequelize 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 導入 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 而完全不依賴任何字符串別名。 您可以通過設置 operatorsAliases 選項來限制您的應用程序需要的別名,請記住清理用戶輸入,尤其是當您直接將它們傳遞給 Sequelize 方法時。

您還可以使用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 上使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM