sequelize
でDATE_FORMAT
を使ったSQLを書きたい場合の備忘録。
集計するときとかにDATE_FORMAT
使って書くけど、それをsequelize
ではどうやって実現するのか?と調べてみたメモです。
こんな感じで、今月作成したユーザ情報を取得するSQL
をsequelize
を使って書きたい。
(実際に集計する場合はCOUNT(*) as count
になるでしょうか)
SELECT
*
FROM
users
WHERE
DATE_FORMAT(createdAt, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m')
node.js with sequelize
で書くと下記のようになる。
(async () => {
/*
・
・ sequelizeの読み込みなどの処理は割愛します
・
*/
// 現在の日付を参照するため、ここではmomentを使おうと思います
const moment = require('moment');
/*
* UserはModelです
* http://docs.sequelizejs.com/manual/tutorial/models-usage.html
*/
const users = await User.findAll({
where: sequelize.where(sequelize.fn('DATE_FORMAT', sequelize.col('createdAt'), '%Y%m'), moment().format('YYYYMM'))
});
// 今月作成したユーザ情報のmodel instancesが表示されます
console.log(users)
})();
以下、メモ。と参照したドキュメントのURL。
sequelize.where
を使ってwhere
を作成している。
moment().format('YYYYMM')
で取得した今日の日付のYYYYMM
形式を、引数として渡している。
http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html#static-method-where
sequelize.fn('DATE_FORMAT',
を使ってDATE_FORMAT
を実現できるよう。
http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html#static-method-fn
sequelize.col
は引数に対象となるcolumn
を入れることで、対象DBのカラムを表現してくれるobjectを返してくれる。
ここではcreatedAt
を指定することで、ユーザの作成日
を対象としている。
http://docs.sequelizejs.com/class/lib/sequelize.js~Sequelize.html#static-method-col
where: sequelize.where(sequelize.fn('DATE_FORMAT', sequelize.col('createdAt'), '%Y%m'), moment().format('YYYYMM'))
sequelize
を使い始めて半年、未だにドキュメントを読むのに苦労している自分です(遠い目)