El SQL original es el siguiente, la última columna es la diferencia horaria. Pero necesito convertirlo en segundos para estadísticas posteriores.
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
El primer método es un método preciso, que extrae las horas, los minutos y los segundos y luego los acumula:
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;
El segundo método es un método aproximado, sin el número de segundos después del punto decimal, pero también es aceptable aquí.
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
Al final, todavía usé el método 1. Tenga en cuenta que la cláusula WITH...AS anterior, que es la expresión de tabla común (CTE) de Oracle, es muy concisa.
referencia
- 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