LoginSignup
5
2

More than 5 years have passed since last update.

sequelizeでDATE_FORMATを使った処理を書く

Posted at

sequelizeDATE_FORMATを使ったSQLを書きたい場合の備忘録。
集計するときとかにDATE_FORMAT使って書くけど、それをsequelizeではどうやって実現するのか?と調べてみたメモです。

こんな感じで、今月作成したユーザ情報を取得するSQLsequelizeを使って書きたい。
(実際に集計する場合は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を使い始めて半年、未だにドキュメントを読むのに苦労している自分です(遠い目)

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2