DB が SQLite、ORM として Sequelize を使っていますが、日時の範囲検索をしようとしてどのように記述していいのか分からず、ちょっとはまりました。
環境
- Node.js v14.17.4
- sequelize@6.6.5
- sqlite3@5.0.2
サンプルコード
where
に指定できる条件として、$gte
とか $lt
とか $between
とかで示している記事がありますが、そのように書いても正しく検索できませんでした。
最新の公式ドキュメントを見ると、上記のような記述は見当たらなかったので、Sequelize.Op
を使って記述すると正しく検索できました。
let begin = new Date(2021, 0, 1, 1, 0, 0, 0);
let end = new Date(2021, 1, 1, 0, 0, 0, 0);
let users = await Users.findAll({
where: {
birthday: {
[Sequelize.Op.gte]: begin,
[Sequelize.Op.lt]: end
}
},
});
条件を動的に記述する場合は以下のようにしたら上手くいきました。
let filter = {}
if (begin || end) {
filter['birthday'] = {}
if (begin) {
filter['birthday'][Sequelize.Op.gte] = begin
}
if (end) {
filter['birthday'][Sequelize.Op.lt] = end
}
}
let users = await Users.findAll({
where: filter,
});
やっぱ公式のドキュメントは最初にチェックするようにしないとだめですね。
無駄にはまってしまいました。