😊

【NestJS】テーブルから任意ユーザーの今月のデータ数を取得する方法

2024/12/02に公開

実装方法

const today = new Date()
const monthStart = new Date(today.getFullYear(), today.getMonth(), 1, 0, 0, 0, 0)
const monthEnd = new Date(today.getFullYear(), today.getMonth() + 1, 0, 23, 59, 59, 999)

const thisMonthTrainingDaysQuery = t.getRepository(UserTrainingHistory)
        .createQueryBuilder('uth')
        .select('DATE(uth.created_at)', 'training_date')
        .where('uth.user_id = :userId', { userId })
        .andWhere(
          'uth.created_at BETWEEN :startDate AND :endDate',
          { startDate: monthStart, endDate: monthEnd }
        )
        .distinct(true)

const thisMonthTrainingDays = (await thisMonthTrainingDaysQuery.getRawMany()).length

解説

上記の実装だと下記のようなSQL文が実行される

SELECT DISTINCT DATE(uth.created_at) AS training_date
FROM user_training_history uth
WHERE uth.user_id = :userId AND uth.created_at BETWEEN :startDate AND :endDate;

DATE(uth.created_at)は、データベースの日時型の値から日付部分だけを抽出します。
例えば、2024-12-01 12:00:00 を 2024-12-01と返します。

1つ目のwhereで指定されたユーザーIDで任意のユーザーデータのみに絞ります。
2つ目のwhereで今月分のユーザーデータのみに絞りますあ。

distinctで日付単位で重複なく返すようにすれば、1ヶ月に何日トレーニングしたか分かるようになります。

Discussion