4


0

SQL番号を時刻に変換して、日付の比較を実行する

タイムスタンプではなく、整数として設定された2つのフィールドでのSQL時間比較に苦労しています。

開発者が最初にint(8)として設定したデータベースにいくつかのパフォーマンスメトリックがあります。 データベースには、トランザクションの開始時刻と終了時刻が含まれています。 例えば

一部のサンプルデータは

id | start_time | end_time
---------------------------
1  |      85958 | 90001

2つの値を単純に減算すると、トランザクション時間が3だけのときに4043秒になります。 ただし、日付の比較を実行できるように値を時刻形式に変換するのに苦労しています。

データベースには1日あたり数百の行があるため、アプリケーション内でこの計算を行うことはできません。また、トランザクションの平均時間と最大時間を計算しようとしています。

編集:

明確にするために

時間は秒単位です85958は8:59:58を表します90001は9:00:01を表します

さらに悪いことに、0:01:00の深夜1分は100と表されます。

5 Answer


3


これをMySQLでテストしましたが、DB2で機能するようにテクニックを適合させることができると確信しています。

SELECT
    (end_time DIV 10000) * 3600 +
    ((end_time DIV 100) % 100) * 60 +
    end_time % 100 -
    (start_time DIV 10000) * 3600 -
    ((start_time DIV 100) % 100) * 60 -
    start_time % 100
FROM table1

結果:

3

動作方法は、整数除算とモジュロ演算を使用して、各タイムスタンプのHH MMおよびSS部分を抽出し、各部分を秒に変換することです。 次に、秒が合計されて、各タイムスタンプの午前0時からの合計秒数が形成されます。 これら2つの違いは、トランザクション時間を示します。

トランザクションが午前0時より前に開始され、午前0時以降に終了する場合、これは機能しません。 日付が変更されたかどうかを検討し、これを修正する必要があります。 データベースにその日が保存されていない場合は、負の変換時間を探して24時間を追加して正の値にすることができます(これにより、トランザクションの長さが1日を超えない限り、これは実際にはありそうもないと思います)。

DB2向けにこれを書いた私の試み(未テスト):

SELECT
    (end_time / 10000) * 3600 +
    MOD(end_time / 100, 100) * 60 +
    MOD(end_time, 100) -
    (start_time / 10000) * 3600 -
    MOD(start_time / 100, 100) * 60 -
    MOD(start_time, 100)
FROM table1


3


DB2 for LUWを使用していると仮定すると、いくつかの機能を使用してこれを行うことができます。

  • DIGITS()–整数のゼロ詰め文字列を提供します

  • TRANSLATE()-文字列を再フォーマット

  • MIDNIGHT_SECONDS-真夜中からの秒数を返します 時間。

これは、値が100 = '00:01:00 'の場合に機能します。

例:

select
   id,
   MIDNIGHT_SECONDS(TRANSLATE('EF:GH:IJ',DIGITS(end_time),'ABCDEFGHIJ')) -
      MIDNIGHT_SECONDS(TRANSLATE('EF:GH:IJ',DIGITS(start_time),'ABCDEFGHIJ')) as runtime
from
   your_table;

上記の式は、start_time> end_timeの場合は機能しません(つまり、start_timeは真夜中より前ですが、end_timeは真夜中より後です)。

もちろん、実際の問題はINTを使用してTIMEを保存することです。 TIME(または、より良いのはTIMESTAMP)を使用するようにデータモデルを修正することをお勧めします。


2


変換する必要がありますか? おそらく、この数値はミリ秒を表しているため、差は最大4秒になります。


2


最終的な差が3であると推測することにより、実際には時間:分:秒で08:59:58と09:00:01になるように値を設定することをお勧めします

しかし、これらはすべてあなたの会社の他の人に彼らが何であるかを尋ねるのに必要な推測です-元のコーダーが去ったとしても他の誰かがこれらを使用したに違いないので


0


すでに説明した回答のほとんどはすべて有効ですが、残念ながら、iSeriesはさまざまな機能について口論しているように見えるため、回答を調整して機能させる必要がありました。

私が得た最終的な解決策は

`select TIME(SUBSTR(DIGITS(END_TIME)、1,2)CONCAT ':' CONCAT SUBSTR(DIGITS(END_TIME)、3,2)CONCAT ':' CONCAT SUBSTR(DIGITS(END_TIME)、5,2))-TIME (SUBSTR(DIGITS(START_TIME)、1,2)CONCAT ':' CONCAT SUBSTR(DIGITS(START_TIME)、3,2)CONCAT ':' CONCAT SUBSTR(DIGITS(START_TIME)、5,2))from table1; `

迅速かつ詳細な回答をありがとう