sql >> Databasteknik >  >> RDS >> Oracle

Oracle-skärm mer än 24 timmar

Du måste dra isär tidsskillnaden i dess beståndsdelar dag, timme, minut och sekund, kombinera antalet dagar * 24 med antalet timmar och sätta ihop det igen.

När du subtraherar datum får du skillnaden som antalet dagar, så du måste konvertera bråkdelen till de andra elementen, vilket du kan göra med en kombination av trunc och mod; använda en CTE för att göra detta lite lättare att följa och visa varje värde för sig såväl som kombinerat till en enda sträng:

with y as (
  select id, end_time - start_time as runtime
  from mytable
)
select id,
  runtime,
  trunc(runtime) as days,
  24 * trunc(runtime) as day_hours,
  trunc(24 * mod(runtime, 1)) as hours,
  trunc(60 * mod(24 * (runtime), 1)) as minutes,
  trunc(60 * mod(24 * 60 * (runtime), 1)) as seconds,
  lpad(24 * trunc(runtime)
    + trunc(24 * mod(runtime, 1)), 2, '0')
    ||':'|| lpad(trunc(60 * mod(24 * (runtime), 1)), 2, '0')
    ||':'|| lpad(trunc(60 * mod(24 * 60 * (runtime), 1)), 2, '0')
    as runtime
from y;

        ID    RUNTIME       DAYS  DAY_HOURS      HOURS    MINUTES    SECONDS RUNTIME 
---------- ---------- ---------- ---------- ---------- ---------- ---------- --------
         1 .184918981          0          0          4         26         16 04:26:16 
         2 1.14465278          1         24          3         28         18 27:28:18 

Du kan också konvertera datumen till tidsstämplar för beräkningen, vilket ger dig en intervalltyp, och sedan använda extract funktion för att få elementen istället; rektorn är dock densamma:

with y as (
  select id,
    cast(end_time as timestamp) - cast (start_time as timestamp) as runtime
  from mytable
)
select id,
  runtime,
  extract (day from runtime) as days,
  24 * extract (day from runtime) as day_hours,
  extract (hour from runtime) as hours,
  extract (minute from runtime) as minutes,
  extract (second from runtime) as seconds,
  lpad(24 * extract (day from runtime) + extract (hour from runtime), 2, '0')
    ||':'|| lpad(extract (minute from runtime), 2, '0')
    ||':'|| lpad(extract (second from runtime), 2, '0')
    as runtime
from y;

        ID RUNTIME           DAYS  DAY_HOURS      HOURS    MINUTES    SECONDS RUNTIME 
---------- ----------- ---------- ---------- ---------- ---------- ---------- --------
         1 0 4:26:17.0          0          0          4         26         17 04:26:17 
         2 1 3:28:18.0          1         24          3         28         18 27:28:18 

Eller en liten variation, få skillnaden från datumen och sedan konvertera det till ett intervall:

with y as (
  select id,
    numtodsinterval(end_time - start_time, 'DAY') as runtime
  from mytable
)
...

SQL Fiddle-demo.




  1. SQL DELETE för nybörjare

  2. Använda tupler i SQL IN-sats

  3. Lär dig databasdesign med SQL Server Management Studio (SSMS) – Del 2

  4. Använda Python och MySQL i ETL-processen:SQLAlchemy