MySQL で重複時間を削除して時間差を計算する実装

MySQL で重複時間を削除して時間差を計算する実装

個人的には、実際の開発ではストアド プロシージャの使用はお勧めしません。不便な点が多々あるためです。これを書いたのは、すべて学習のためです。専門家の皆さんが私の内容に問題を感じた場合は、遠慮なく指摘したり批判したりしてください。

必要:

生産現場では、合計ダウンタイム、合計メンバーシップ有効化時間など、2 つの時間の差を計算する必要がある業務がよくあります。 。 。ただし、これらの時間は連続的ではなく、断続的であり、重複する場合もあります。時間差を直接計算することはできません。

例えば:

ドライブ:

最初は、次のような単一の SQL ステートメントで実装することを考えました。

TIMESTAMPDIFF(MINUTE, '2021-08-19 14:30:00', '2021-08-19 15:00:00') を DUAL から選択します。

データベースのデータは数千個あり、これを実行するのは不可能であることがわかりました。また、UNION を使用してそれらを結合することも不可能です。データが大量にある場合は、必ずループが発生します。そのため、Java 言語を使用せずに、ストアド プロシージャを使用して次の問題を解決することにしました。

アイデア:

まず、ループに一度入ったデータは、後続のデータが重複しないように計算されません。

2 番目のデータから始めて、開始時刻が前のデータと重複しているかどうかを判断する必要があります。重複している場合は、終了時刻も重複しているかどうかを確認する必要があります。重複している場合は何もしません。重複していない場合は、この値を前のデータの終了時刻に割り当てます。

開始時刻が範囲内にない場合は、開始時刻が前回の時刻より前か後かを判断する必要があります。

この範囲より前の場合は、この値を前のデータの開始時刻に割り当てます。

この範囲の後に計算して割り当てる

最後のループでは計算と割り当ても必要となる

成し遂げる:

まずテーブルを作成し、データをシミュレートします

テーブルtest01を作成します(
  id int(32) 符号なし NOT NULL AUTO_INCREMENT,
  start_time datetime NOT NULL、
  end_time datetime NOT NULL、
  主キー (`id`)
) 
 
test01(id, start_time, end_time) に値 (1, '2021-08-18 16:27:51', '2021-08-18 17:27:59') を挿入します。
test01(id、start_time、end_time) に値 (2、'2021-08-18 17:20:26'、'2021-08-18 20:10:37') を挿入します。
test01(id, start_time, end_time) に値 (3, '2021-08-18 22:05:57', '2021-08-18 23:55:20') を挿入します。 

ストアド プロシージャを作成します。

CREATE PROCEDURE sumTime()
始める
    -- 変数を定義します -- DECLARE is_old int(1) DEFAULT 0; を初めて使用します。
 
    -- 最終データ DECLARE old_start_time datetime;
	old_end_time datetime を宣言します。
 
	-- このデータは DECLARE start_time datetime; です。
	end_time datetime を宣言します。
 
	-- 結果を返す DECLARE num int(32) DEFAULT 0;
 
	-- ループ終了スイッチ DECLARE done int DEFAULT 0;
 
	-- カーソルを作成する(データベースのデータを照会する)
	DECLARE list CURSOR FOR SELECT a.start_time, a.end_time FROM test01 a;
 
    -- 最後のループを定義し、ループ終了スイッチを1に設定します
	SQLSTATE '02000' の CONTINUE ハンドラーを宣言し、done=1 を設定します。
 
	--カーソルを開く OPEN リスト;
 
		-- オープンループ posLoop:LOOP
			-- 現在のループの値を取得し、現在のデータ変数に割り当てます FETCH list INTO start_time,end_time;
			-- 初めてかどうかを判定します if (is_old = 0) THEN 
 
				is_old = 1 に設定します。
				古い開始時刻を start_time に設定します。
				古い終了時刻を終了時刻に設定します。
 
			 -  それ以外
				-- 間隔内かどうかをチェックする if (start_time >= old_start_time AND start_time <= old_end_time) THEN
 
					-- 終了時刻が間隔内にないか確認します if (end_time < old_start_time OR end_time > old_end_time) THEN
						古い終了時刻を終了時刻に設定します。
				   終了の場合;
 
				  -  それ以外
 
				   (開始時刻 < 古い開始時刻)の場合
 
						古い開始時刻を start_time に設定します。
 
					 それ以外
 
						数値 = 数値 + TIMESTAMPDIFF(MINUTE, old_start_time, old_end_time); を設定します。
						古い開始時刻を start_time に設定します。
						古い終了時刻を終了時刻に設定します。
					 終了の場合;
				 終了の場合;
			終了の場合;
			-- 最後のループかどうかをチェックする IF done=1 THEN 
			    数値 = 数値 + TIMESTAMPDIFF(MINUTE, old_start_time, old_end_time); を設定します。
			    POSループを終了します。
			終了の場合;
		-- ループを終了する	
		ループ終了 posLoop;
	-- カーソル CLOSE リストを閉じます。
	数値を選択します。
終わり;
-- ストアド プロシージャを呼び出します。call sumTime(); 

-- ストアド プロシージャを削除します (存在する場合、drop procedure、sumTime)。

これで、MySQL で重複時間を削除して時間差を計算する方法についての記事は終了です。MySQL で時間差を計算することに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLは2つの日付間の日数、月数、年数を計算します
  • mysql 時間差計算関数
  • MySQL 5.7 のスロークエリログの時間がシステム時間より 8 時間遅れている理由の詳細な説明
  • MySQLクエリで2つの時刻の差を取得する方法

<<:  中国の専門ではない:文化の違いの中でのウェブ開発

>>:  CSS3 box-shadow プロパティの詳細な例

推薦する

リアルタイムクロックを実装するネイティブJS

ネイティブ JS で実装したリアルタイム クロック エフェクトを共有します。エフェクトは以下のとおり...

UbuntuはCUDAの複数のバージョンをインストールし、いつでも切り替えることができます

CUDA とは何かを紹介するのではなく、複数の CUDA バージョンの共存とリアルタイム切り替えをど...

Ansibleを使用してディレクトリ内のすべてのコンテンツを削除する方法

Ansible を使用する学生は、以下に示すように、Ansible が特定のフォルダーまたはファイル...

Docker を使用して Nginx+Flask+Mongo アプリケーションをデプロイする

サーバーにはNginx、データベースサポートにはMongo、Python言語のWebフレームワークに...

MySQLデュアルマシンホットスタンバイと負荷分散の実装手順の詳細説明

MySQL データベースには増分バックアップ メカニズムはありませんが、マスター データベース内のす...

...

dockerカスタムイメージでphp7をビルドする方法

まず、簡単な Docker インストールを実行します。イメージをカスタマイズするには、ベースイメージ...

CocosCreatorでWeChatゲームを作成する方法

目次1. WeChatパブリックプラットフォームからWeChat開発者ツールをダウンロードする2. ...

ページネーションの例とベストプラクティス

<br />構造と階層により複雑さが軽減され、読みやすさが向上します。記事やサイトが整理...

jsを使って簡単な計算機を作る

この記事では、jsで簡単な計算機を作成する具体的なコードを参考までに共有します。具体的な内容は次のと...

MySQLのFreeListメカニズムの詳細な説明

1. はじめにMySQL が起動すると、BufferPool が初期化されます。クエリ操作を実行する...

データページング効果を実現する js オブジェクト

この記事の例では、データのページング効果を実現するためのjsオブジェクトの具体的なコードを参考までに...

CentOS 8 に MariaDB をインストールするための詳細なチュートリアル

MariaDB データベース管理システムは MySQL のブランチであり、主にオープンソース コミュ...

HTML ハイパーリンク スタイル (4 つの異なる状態) の設定例

コードをコピーコードは次のとおりです。 <スタイル タイプ="text/css&qu...

Idea で Tomcat のソースコードデバッグを開始し、デバッグのために Tomcat に入る方法

idea 開発ツールを使用してコードをデバッグする場合、Java Web プロジェクトで、Web コ...