sql >> Database >  >> RDS >> Oracle

Oracle-weergave meer dan 24 uur

Je moet het tijdsverschil uit elkaar halen in de samenstellende dag-, uur-, minuut- en tweede-elementen, het aantal dagen * 24 combineren met het aantal uren, en het weer bij elkaar plakken.

Bij het aftrekken van datums krijg je het verschil als het aantal dagen, dus je moet het fractionele deel converteren naar de andere elementen, wat je kunt doen met een combinatie van trunc en mod; een CTE gebruiken om dit iets gemakkelijker te volgen te maken en elke waarde op zijn eigen en gecombineerd in een enkele string te tonen:

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 

U kunt de datums ook converteren naar tijdstempels voor de berekening, waardoor u een intervaltype krijgt, en vervolgens het extract gebruiken functie om in plaats daarvan de elementen te krijgen; de hoofdsom is echter hetzelfde:

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 

Of een kleine variatie, het verschil krijgen van de datums en dat vervolgens omzetten in een interval:

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

SQL Fiddle-demo.




  1. Een postgresql-sessie/verbinding beëindigen

  2. SQL, Postgres OID's, wat zijn het en waarom zijn ze nuttig?

  3. Effectieve monitoring van MySQL-replicatie met SCUMM-dashboards:deel 2

  4. MySQL diakritisch ongevoelig zoeken (Spaanse accenten)