[英]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
庫。
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,
},
},
});
筆記:
$gt
代表“大於”。 您可以使用$gte
而不是$gt
。 $gte
代表“大於或等於”。 當然$lte
也一樣。$lt
和$gt
以確保日期不是未來(根據原始問題)。[Sequelize.Op.gt]
而不是$gt
。 如果在 Sequelize v5 上使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.