MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでタイムスタンプの差を時間単位で計算する方法

MongoDBで2つの日付(タイムスタンプ)の差を時間単位で求めたい場合は、アグリゲーションフレームワーク(aggregate)を利用します。この記事では、具体的なサンプルデータを作成しながら、タイムスタンプの差を時間で計算する手順をわかりやすく解説します。

計算の仕組み

MongoDBでは、$subtract演算子を使って2つのISODateを減算すると、その差がミリ秒で返されます。1時間は3,600,000ミリ秒なので、この値を$divide演算子で3,600,000(= 60秒 × 60分 × 1000ミリ秒)で割ることで、時間単位の差を求めることができます。

ステップ1:サンプルコレクションを作成する

まず、映画の開始時刻と終了時刻を含むドキュメントを持つコレクションを作成します。

> db.timestampDifferenceDemo.insertOne({
   "MovieBeginningTime": new ISODate("2019-05-12 10:20:30"),
   "MovieEndingTime": new ISODate("2019-05-12 12:30:20")
});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd7ba1f6d78f205348bc644")
}
> db.timestampDifferenceDemo.insertOne({
   "MovieBeginningTime": new ISODate("2019-05-12 04:00:00"),
   "MovieEndingTime": new ISODate("2019-05-12 07:10:00")
});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd7ba3b6d78f205348bc645")
}

ステップ2:登録したドキュメントを確認する

find()メソッドとpretty()を組み合わせて、コレクション内のすべてのドキュメントを整形して表示します。

> db.timestampDifferenceDemo.find().pretty();

上記のクエリを実行すると、次のような出力が得られます。

{
   "_id" : ObjectId("5cd7ba1f6d78f205348bc644"),
   "MovieBeginningTime" : ISODate("2019-05-12T10:20:30Z"),
   "MovieEndingTime" : ISODate("2019-05-12T12:30:20Z")
}
{
   "_id" : ObjectId("5cd7ba3b6d78f205348bc645"),
   "MovieBeginningTime" : ISODate("2019-05-12T04:00:00Z"),
   "MovieEndingTime" : ISODate("2019-05-12T07:10:00Z")
}

ステップ3:タイムスタンプの差を時間単位で計算する

次に、アグリゲーションパイプラインの$projectステージ内で、$subtract$divideを組み合わせて時間差を計算します。

> db.timestampDifferenceDemo.aggregate([
   {$project: {
      DifferenceInHours: {$divide: [{$subtract: ["$MovieEndingTime", "$MovieBeginningTime"]}, 3600000]}
   }}
]);

このクエリを実行すると、各ドキュメントのタイムスタンプの差が時間単位で出力されます。

{ "_id" : ObjectId("5cd7ba1f6d78f205348bc644"), "DifferenceInHours" : 2.1638888888888888 }
{ "_id" : ObjectId("5cd7ba3b6d78f205348bc645"), "DifferenceInHours" : 3.1666666666666665 }

結果の解釈

最初のドキュメントでは、映画の上映時間が約2.16時間(2時間9分50秒)であることがわかります。2つ目のドキュメントでは、約3.17時間(3時間10分)という結果になっています。

補足:小数点以下を丸めたい場合

結果を整数の時間で表示したい場合は、$round演算子や$floor演算子を組み合わせると便利です。

> db.timestampDifferenceDemo.aggregate([
   {$project: {
      DifferenceInHours: {$round: [{$divide: [{$subtract: ["$MovieEndingTime", "$MovieBeginningTime"]}, 3600000]}, 2]}
   }}
]);

同様の考え方で、分単位なら360,000で、秒単位なら1,000で割ることで、任意の単位に変換できます。ログ分析やセッション時間の集計など、さまざまな場面で応用できるテクニックなので、ぜひ活用してみてください。

  1. MongoDBでタイムスタンプの降順にデータを並べ替える方法

    MongoDBでタイムスタンプを基準にデータを並べ替えたい場合には、sort()メソッドを使用します。降順(新しい日付が先頭)で並べ替えるには、ソート条件として -1 を指定します。ここでは、実際にコレクションを作成してドキュメントを挿入し、タイムスタンプの降順に並べ替える手順を順番に見ていきましょう。サンプルデータの作成まず、insertOne()メソッドを使って、タイムスタンプを持つドキュメントを複数件コレクションに挿入します。> db.demo737.insertOne({timestamp : new ISODate(2020-04-01 )}); { acknowledg

  2. Excelで時間差を計算する方法|####エラーとAM/PM表示を解決するコツ

    Microsoft Excelは、予算管理や税額計算など、幅広い用途に活用できる強力な表計算ソフトです。豊富な機能を活かせば、電卓代わりとしても使えます。さらに、Excelでは2つの時刻の差(時間差)を計算することも可能です。たとえば、従業員の勤務開始時刻と終了時刻から実際の勤務時間を算出したり、勤務時間の記録を一元管理して給与や賃金の計算に役立てたりできます。 「時間差の計算なら、終了時刻から開始時刻を引くだけだから簡単」と思うかもしれません。しかし、単純に引き算を実行すると、2つの問題に直面します。この記事では、その問題点と具体的な解決方法をわかりやすく解説します。 Excelで時間差を