個人的には、実際の開発ではストアド プロシージャの使用はお勧めしません。不便な点が多々あるためです。これを書いたのは、すべて学習のためです。専門家の皆さんが私の内容に問題を感じた場合は、遠慮なく指摘したり批判したりしてください。 必要:生産現場では、合計ダウンタイム、合計メンバーシップ有効化時間など、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 プロパティの詳細な例
この記事では、マウスを動かしたときにセカンダリ メニュー バーを実装するために HTML+CSS を...
目次1. はじめに2. MVCC (マルチバージョン同時実行制御メカニズム) 2.1 繰り返し読み取...
例示するフロントエンド開発では、セルの幅を制限し、コンテンツが制限を超える部分に省略記号を表示する必...
会社が現在使用しているソリューションを確認するためにバックエンドにログインしました。使用される FT...
1. 概念分析 1: UE ユーザー エクスペリエンス <br />英語ではユーザー エ...
購入証明書Alibaba CloudのCloud Shield証明書サービスから購入できます。証明書...
前面に書かれた近年、ライブストリーミング業界は非常に人気が高まっています。伝統的な業界でのライブスト...
1. 概要MySQL データベースの日常的な操作とメンテナンスにおいて、ユーザーが誤ってデータを削...
この記事の例では、どこにでも移動できるフローティングボタンを実現するためのVueの具体的なコードを共...
注意すべき点は、イベントバブリング自体の特性上、メリットだけでなくデメリットも生じるということです。...
1. まずシステムにmysqlがインストールされているかどうかを確認します rpm -qa | gr...
学生.xml <?xml バージョン="1.0" エンコーディング=&qu...
環境変数の設定の簡単な説明プログラムは、環境によって異なる環境変数を必要とします。たとえば、実稼働環...
最初のステップは、Python のバージョン番号とインストール パスを確認することです。 上記のビュ...
SVN サービスのバックアップ手順1. ソースサーバーとターゲットサーバーを準備するソースサーバー:...