8時間前から現時刻までの30分間隔で各アイテムの時間を元に集計する必要があり、その際のメモとなります。今回は1時間の30分刻み版と実行時間からの30分刻み版の2種類を紹介します
実装方法としてはそんなに難しくないものでした
時刻を取得する
1時間の30分刻み版
対象の時刻を分とそれ以外の年月日時をそれぞれ保持します
DateTime slotStartTime = new DateTime(itemCreateTime.Year, itemCreateTime.Month, itemCreateTime.Day, itemCreateTime.Hour, 0, 0);
int minutes = itemCreateTime.Minute;
実行時間からの30分刻み版
実行時刻から8時間前を求め、時間区切り用の配列に30分ごとの時間を格納していきます
// 現時刻から8時間前を取得
DateTime eightHoursAgo = dateTime.AddHours(-8);
// 時間区切り用の配列作成
DateTime currentTimeSlot = eightHoursAgo;
List<DateTime> timeSlots = new List<DateTime>();
while (currentTimeSlot < dateTime)
{
timeSlots.Add(currentTimeSlot);
currentTimeSlot = currentTimeSlot.AddMinutes(30);
}
各30分ごとに格納する
1時間の30分刻み版
取得した分が30分より前か後かで判断してカウント
// 30分より前か後か判定する
int slotIndex = minutes / 30;
DateTime slotKey = slotStartTime.AddMinutes(slotIndex * 30);
if (!slotCounts.ContainsKey(slotKey))
{
slotCounts[slotKey] = 1;
}
else
{
slotCounts[slotKey]++;
}
実行時間からの30分刻み版
上記で求めたスロットタイムに該当するかどうかを判定してカウント
foreach (DateTime timeSlot in timeSlots)
{
if (itemCreateTime >= timeSlot && itemCreateTime < timeSlot.AddMinutes(30))
{
if (!slotCounts.ContainsKey(timeSlot))
{
slotCounts[timeSlot] = 1;
}
else
{
slotCounts[timeSlot]++;
}
break; // アイテムは1つの時間スロットにのみカウントされる
}
}
最期に
今回紹介したコードを以下のGitHubにアップしていますので参考にしてください
-
BlogSampleCodeProjects/Aggregation at main · nasuton/BlogSampleCodeProjects · GitHub
Project for sample code used in the blog.(Blogで記載しているサンプルコード ...
続きを読む
会社紹介
私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています
会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造
この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています
ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します
-
アドバンスド・ソリューション株式会社
アドバンスド・ソリューションは主にMicrosoft製品を使用して、企業の生産性向上に取り組んでいます。要件定義から導入 ...
サイトへ移動
-
お問い合わせ | アドバンスド・ソリューション株式会社
お問い合わせはこちら