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

推薦する

Docker に MySQL をデプロイする例

目次1 コンテナクラウドとは何ですか? 2 Dockerの紹介3 dockerを使ってMySQLをイ...

JavaScriptはスクロールバーの位置を取得し、ページをアンカーポイントまでスライドします。

序文この記事は、私が最近仕事で遭遇した問題を記録したものです。アプリネイティブとフロントエンドのh5...

CentOS インストール mysql5.7 詳細チュートリアル

この記事では、参考までに、centOSにmysql5.7をインストールする詳細な手順を紹介します。具...

Tomcat の設定と Eclipse での起動方法

目次Tomcat8のインストールと設定方法tomcat ダウンロードTomcat マネージャーを有効...

MySQL で主キーと ROWID を使用する際の落とし穴の概要

序文MySQL の rowid の概念については聞いたことがあるかもしれませんが、テストや実践が難し...

CentOS7 で yum ソースをインストールし、コマンド rz と sz をアップロードおよびダウンロードする方法 (画像付き)

** CentOS7 で yum ソースをインストールし、rz および sz コマンドをアップロー...

Vue の this.$store.state.xx.xx に関する簡単な説明

目次これを Vue.$store.state.xx.xxストアからデータを取得する私のプロジェクトフ...

アコーディオン効果を実現するJavaScript

この記事では、アコーディオン効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

VMware ワークステーション 12 に Ubuntu 14.04 (64 ビット) をインストール

1. インストール環境コンピュータモデル: Lenovo Y471a (i5) ノートパソコンシステ...

ユーザーエクスペリエンスの要素またはWebデザインの要素

システムとユーザー環境の設計<br />Apple システムの成功は、そのシステム アー...

MySQL 8.0.12 winx64 詳細なインストールチュートリアル

この記事では、MySQL 8.0.12のインストールチュートリアルを参考までに紹介します。具体的な内...

CSS のマージンの崩壊問題を解決する方法

まず、マージン崩壊が発生する 3 つの状況を見てみましょう。 1. 隣接する 2 つのブロックレベル...

MySQLデスクトップツールSQLyogのリソースとアクティベーション方法は、白黒のコマンドラインに別れを告げます

では、早速リソースについて見ていきましょう。 123WORDPRESS.COM ダウンロードSQLy...

WeChatアプレットでのwxsファイルの素晴らしい使い方をいくつか紹介します

目次序文応用フィルタードラッグファイル間での参照の受け渡しwxsはjsロジック層にパラメータを渡しま...

UbuntuでMySQLデータベースファイルディレクトリを変更する方法

序文同社の Ubuntu サーバーは、さまざまなシステムのディレクトリを異なる論理パーティションに配...