Oracle中将2个timestamp列的差转换为秒

最初的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

猜你喜欢

转载自blog.csdn.net/stevensxiao/article/details/130546124