プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2021/08/27

[Node.js] SQLite + Sequelize で日時の範囲検索

event_note2021/08/27 7:28

DB が SQLite、ORM として Sequelize を使っていますが、日時の範囲検索をしようとしてどのように記述していいのか分からず、ちょっとはまりました。

環境

サンプルコード

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,
});

やっぱ公式のドキュメントは最初にチェックするようにしないとだめですね。
無駄にはまってしまいました。