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

推薦する

チェックボックスの不確定プロパティの使用の紹介

Windows XP でフォルダーのプロパティ ダイアログ ボックスを使用すると、フォルダーの属性カ...

Docker クロスサーバー通信オーバーレイソリューション (パート 1) Consul 単一インスタンス

目次シナリオタスクアイデア分析するコンセプトと選択ちょっとしたテスト環境説明予防実践テスト引用シナリ...

Docker で Zookeeper をインストールする (スタンドアロンおよびクラスター)

Docker を起動したら、利用できるオプションを見てみましょう。 公式のものがある場合は、もちろ...

MySQLインスタンスクラッシュ事例の詳細な分析

[問題の説明]私たちの実稼働環境には、複数の MySQL サーバー (MySQL 5.6.21) の...

MySQL データ型 DECIMAL の使用方法の詳細な説明

MySQL DECIMALデータ型は、データベースに正確な数値を保存するために使用されます。会計シス...

IE で ClearType をオンにした後の透明フォントの問題の解決方法

IE で ClearType をオンにした後に発生する透明フォントの問題を解決するには、透明要素に背...

JavaScript クロージャの説明

目次1. クロージャとは何ですか? 1.2 クロージャのメモ化: 関数は定義された環境を記憶する1....

htmlハイパーリンクaのクリックイベントの後、hrefで指定されたアドレスにジャンプします。

場合によっては、ジャンプを完了するために href の代わりにハイパーリンク <a> を...

今日は、珍しいけれど役に立つJSテクニックをいくつか紹介します

1. 戻るボタンhistory.back() を使用してブラウザの「戻る」ボタンを作成します。 &l...

ウェブフロントエンド開発の細部

1 選択タグは閉じられている必要があります <select></select>...

win10 での mysql 8.0.16 winx64 インストールの最新グラフィック チュートリアル

このデータベースをダウンロードするには、多くの時間とトラフィックがかかります。踏み込んだ落とし穴で時...

Clickhouse Docker クラスターの展開と構成を例を使って説明します

目次前面に書かれた環境の展開Zookeeper クラスタの展開Clickhouse クラスターの展開...

Vue.js と MJML でレスポンシブなメールを作成する

MJML は、開発者が美しく、応答性に優れ、あらゆるデバイスやメール クライアントで動作する魅力的な...

Docker イメージのプルとタグ操作 pull | tag

Fabric プロジェクトのソースコードを読み直してみたところ、Docker の部分でよくわからな...

美しいチェックボックススタイル(複数選択ボックス)はIE8/9/10、FFなどと完全に互換性があります。

恥ずかしながら、このようなよく使われるチェックボックスのスタイルを変更するために、Baidu で長い...