😊
【NestJS】テーブルから任意ユーザーの今月のデータ数を取得する方法
実装方法
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