個人的には、実際の開発ではストアド プロシージャの使用はお勧めしません。不便な点が多々あるためです。これを書いたのは、すべて学習のためです。専門家の皆さんが私の内容に問題を感じた場合は、遠慮なく指摘したり批判したりしてください。 必要:生産現場では、合計ダウンタイム、合計メンバーシップ有効化時間など、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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: CSS3 box-shadow プロパティの詳細な例
目次1 コンテナクラウドとは何ですか? 2 Dockerの紹介3 dockerを使ってMySQLをイ...
序文この記事は、私が最近仕事で遭遇した問題を記録したものです。アプリネイティブとフロントエンドのh5...
この記事では、参考までに、centOSにmysql5.7をインストールする詳細な手順を紹介します。具...
目次Tomcat8のインストールと設定方法tomcat ダウンロードTomcat マネージャーを有効...
序文MySQL の rowid の概念については聞いたことがあるかもしれませんが、テストや実践が難し...
** CentOS7 で yum ソースをインストールし、rz および sz コマンドをアップロー...
目次これを Vue.$store.state.xx.xxストアからデータを取得する私のプロジェクトフ...
この記事では、アコーディオン効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...
1. インストール環境コンピュータモデル: Lenovo Y471a (i5) ノートパソコンシステ...
システムとユーザー環境の設計<br />Apple システムの成功は、そのシステム アー...
この記事では、MySQL 8.0.12のインストールチュートリアルを参考までに紹介します。具体的な内...
まず、マージン崩壊が発生する 3 つの状況を見てみましょう。 1. 隣接する 2 つのブロックレベル...
では、早速リソースについて見ていきましょう。 123WORDPRESS.COM ダウンロードSQLy...
目次序文応用フィルタードラッグファイル間での参照の受け渡しwxsはjsロジック層にパラメータを渡しま...
序文同社の Ubuntu サーバーは、さまざまなシステムのディレクトリを異なる論理パーティションに配...