1

他の人から継承したスクリプトを使用して Ingres DB に取り組んでいます。スクリプトを変更して、最新の start_time イベントと end_time イベントの action_times と、2 つのイベントの差を引き出す必要があります。DB のサンプルを以下に示します。

id_num  | version  | action_id  |   action_time
----------------------------------------------------------------------------
1         2          start_time     2014-05-26 14:58:14
1         2          end_time       2014-05-26 14:58:16
1         4          start_time     2014-05-27 10:10:57
1         4          end_time       2014-05-27 10:10:11

これまでのところ、私が思いついたのは次のとおりです。

SELECT max(a.action_time) as BIG, max(b.action_time) as SMALL, max(a.action_time) - max(b.action_time) as DIFF
FROM table1 as a, table1 as b,
WHERE a.id_num = '1' AND a.action_id = 'end_time' AND b.id_num = '1' AND b.action_id = 'start_time'

しかし、結果は次のようになります。

BIG                         SMALL                   DIFF
----------------------------------------------------------------------------
2014-05-27 10:10:11         2014-05-27 10:10:57     null    

このような質問がすでに回答されている場合は申し訳ありませんが (おそらく回答されていると思います)、さまざまなフォーラムを数日かけて調べましたが、同様の例が見つかりません。おそらく、検索の言い回しです。条項。大学でこのようなことをカバーしたと確信していますが、それは数年前のことで、最近のSQLは少し錆びています。前もって感謝します!

編集:いくつかの調査の後、DB GUIで機能する次のことを思いつきました:

SELECT ingresdate(varchar(max(a.action_time))) as BIG, ingresdate(varchar(max(b.action_time))) as SMALL, date_part('secs',ingresdate(varchar(max(a.action_time))) - ingresdate(varchar(max(b.action_time)))) as DIFF
FROM table1 as a, table1 as b,
WHERE a.id_num = '1' AND a.action_id = 'end_time' AND b.id_num = '1' AND b.action_id = 'start_time'
4

3 に答える 3

0

これにはサブセレクトを使用します。試す :-

select a.action_time as max_end_time, b.action_time as max_start_time, 
a.action_time - b.action_time as diff
from table a, table b

where a.action_time = (select max(action_time)
from table where action_id = 'end_time')

and b.action_time = (select max(action_time)
from table where action_id = 'start_time)
于 2014-07-24T20:48:34.213 に答える
0

これが私の試みです:

SELECT start.action_time, end.action_time, 
  interval('seconds', end.action_time - start.action_time ) as diff_secs
FROM
(
SELECT action_time
FROM table a
INNER JOIN 
(  SELECT max(id_num) as max_id_num, max(version) as max_version FROM table 
) b on ( id_num = max_id_num and version = max_version )
WHERE a.action_id = 'start_time'
) start
CROSS JOIN
(
SELECT action_time
FROM table a
INNER JOIN 
(  SELECT max(id_num) as max_id_num, max(version) as max_version FROM table 
) b on ( id_num = max_id_num and version = max_version )
WHERE a.action_id = 'end_time'
) end

あなたのデータを使用すると、次の出力が得られます。

+----------------------+----------------------+-----------+
|     action_time      |     action_time      | diff_secs |
+----------------------+----------------------+-----------+
| 27-May-2014 10:10:57 | 27-May-2014 10:10:11 |       -46 |
+----------------------+----------------------+-----------+

参考までに、テスト テーブルの作成と入力に使用したスクリプトを次に示します。

CREATE TABLE table
(
id_num integer,
version integer,
action_id char(10),
action_time timestamp
)

INSERT INTO table VALUES (1,2,'start_time', '2014-05-26 14:58:14');
INSERT INTO table VALUES (1,2,'end_time', '2014-05-26 14:58:16');
INSERT INTO table VALUES (1,4,'start_time', '2014-05-27 10:10:57');
INSERT INTO table VALUES (1,4,'end_time', '2014-05-27 10:10:11');
于 2014-08-04T15:28:24.987 に答える
0

max(a.acction_time) と max(b.acction_time) の差を計算する場合は、次のスクリプトを使用する必要があります。

SELECT max(a.acction_time) as BIG, max(b.acction_time) as SMALL,DATEDIFF(s, max(a.acction_time), max(b.acction_time)) as DIFF
FROM table1 as a, table1 as b
WHERE a.id_num = '1' AND a.action_id = 'end_time' AND b.id_num = '1' AND b.action_id = 'start_time'

DATEDIFF() 関数を覚えていない場合は、説明します。

PS: table1 の主キーはどこですか?!!

于 2014-06-08T01:15:44.230 に答える