Le SQL d'origine est le suivant, la dernière colonne est la différence de temps. Mais je dois le convertir en secondes pour les statistiques suivantes.
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
La première méthode est une méthode précise, qui extrait les heures, les minutes et les secondes puis les accumule :
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;
La deuxième méthode est une méthode approchée, sans le nombre de secondes après la virgule décimale, mais elle est également acceptable ici.
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
Au final j'ai quand même utilisé la méthode 1. Notez que la clause WITH...AS ci-dessus, qui est la CTE (Common Table Expression) d'Oracle, est très concise.
référence
- 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