最初的SQL如下,最后1列是时间差。但是我需要转换成秒,以便后续统计。
SELECT
MIN(timestamp) AS start_pop_time,
MAX(timestamp) AS finish_pop_time,
MAX(timestamp) - MIN(timestamp) time_taken
FROM
gv$im_header;
START_POP_TIME FINISH_POP_TIME TIME_TAKEN
----------------------------------- ----------------------------------- -------------------
07-5月 -23 10.24.06.447421000 上午 GMT 07-5月 -23 10.27.00.696010000 上午 GMT +00 00:02:54.248589
第一种方法是精确的方法,将时分秒分别抽取出来然后累加:
WITH rws AS (
SELECT
MIN(timestamp) AS t1,
MAX(timestamp) AS t2
FROM
gv$im_header
)
SELECT
EXTRACT(HOUR FROM(t2 - t1)) * 60 * 60 + EXTRACT(MINUTE FROM(t2 - t1)) * 60 + EXTRACT(SECOND FROM(t2 - t1)) AS pop_elap_secs
FROM
rws;
WITH rws AS (
SELECT
MIN(timestamp) AS t1,
MAX(timestamp) AS t2
FROM
gv$im_header
)
SELECT
EXTRACT(HOUR FROM(t2 - t1)) * 60 * 60 + EXTRACT(MINUTE FROM(t2 - t1)) * 60 + EXTRACT(SECOND FROM(t2 - t1)) AS pop_elap_secs
FROM
rws;
第二种方法是近似的方法,没有小数点后的秒数,不过这里也是可以接收的。
WITH rws AS (
SELECT
MIN(timestamp) AS t1,
MAX(timestamp) AS t2
FROM
gv$im_header
)
SELECT
( CAST(t2 AS DATE) - CAST(t1 AS DATE) ) * 86400 AS pop_elap_secs
FROM
rws;
POP_ELAP_SECS
-------------
174
最终我还是用了方法1。注意以上WITH…AS子句,也就是Oracle的CTE(Common Table Expression),非常简洁。
参考
- https://asktom.oracle.com/pls/apex/f%3Fp%3D100:11:0::::P11_QUESTION_ID:9533863800346031904
- https://jeffkemponoracle.com/2010/10/difference-between-two-timestamps/
- https://stackoverflow.com/questions/11617962/calculating-difference-between-two-timestamps-in-oracle-in-milliseconds