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 プロパティの詳細な例

推薦する

CSS3アニメーションとHTML5の新機能の詳しい説明

1. CSS3アニメーション☺CSS3 アニメーションは、JavaScript を介して要素のスタイ...

Vue+Websocketはチャット機能を実装するだけです

この記事では、チャット機能を簡単に実装するためのVue+Websocketの具体的なコードを参考まで...

MySQL インデックスクエリ最適化スキルを習得するための記事

序文この記事では、DBA がいないチームが参考にできるように、MySQL の一般的な使用に関するヒン...

Node.js でのクラスター作成に関する簡単な説明

目次クラスタクラスターの詳細クラスター内のイベントクラスター内のメソッドクラスター内の属性クラスター...

Reactでコンポーネントロジックを共有する3つの方法

簡単に説明すると、これら 3 つの方法は、レンダリング プロップ、高階コンポーネント、カスタム フッ...

formData 形式タイプを使用してファイルをアップロードする Vue の例

Vue では、一般的にフロントエンドとバックエンドを分離したプロジェクトがあり、データ操作を実装する...

vue+elementui+vuex+sessionStorage を使用して履歴タグ メニューを実装するためのサンプル コード

一般的には、左側にメニューがあった後、ページの上部に履歴タブ メニューを追加する必要があります。他の...

Tomcat クラスローダーの実装方法とサンプルコード

Tomcat は内部的に複数の ClassLoader を定義し、アプリケーションとコンテナーが異な...

Linux 上でプライベート Git サーバーを構築するための詳細なチュートリアル

1. サーバーのセットアップリモート リポジトリは実際にはローカル リポジトリと何ら変わりなく、純粋...

Docker を使用して開発環境を構築する方法 (Windows および Mac)

目次1. Dockerを使用する利点2. Dockerをインストールする1) LinuxにDocke...

Vueはデータを初期状態にリセットします

場合によっては、データ内のデータを再利用する必要がありますが、データ内のデータはさまざまなフォーム、...

MySQL レプリケーションの利点と原則を詳しく説明します

レプリケーションとは、マスター データベースの DDL および DML 操作をバイナリ ログを介して...

CSS 8 目を引く HOVER 効果のサンプル コード

1. エフェクトHTMLを送信する <div id="送信ボタン">...

ReactにおけるRefの相互利用の詳細な説明

目次1. まずRefとは何かを説明しましょう2. フックでのrefの使用1. HTMLDomフックで...

ウェブページのフォント設定についての簡単な説明

サイト全体のフォントを設定することは、常にシンプルでありながら難しい作業です。深く掘り下げていくと、...