Oracle
 sql >> база данни >  >> RDS >> Oracle

Дисплей на Oracle повече от 24 часа

Трябва да разделите часовата разлика в съставните й елементи ден, час, минута и секунда, да комбинирате броя на дните * 24 с броя на часовете и да я залепите отново заедно.

При изваждане на датите получавате разликата като брой дни, така че трябва да преобразувате дробната част в останалите елементи, което можете да направите с комбинация от trunc и mod; използване на CTE, за да направи това малко по-лесно за следване и показване на всяка стойност самостоятелно, както и комбинирано в един низ:

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 

Можете също да преобразувате датите във времеви печати за изчислението, което ви дава тип интервал, и след това да използвате extract функция за получаване на елементите вместо това; принципалът обаче е същият:

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 

Или лека вариация, като се получи разликата от датите и след това се преобразува в интервал:

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

Демонстрация на SQL Fiddle.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразуване на Long в Varchar2

  2. Проблем при сравнение на низове на Oracle PL/SQL

  3. Актуализирайте със заявка за присъединяване в Oracle

  4. ORA-00054:ресурсът е зает и придобива с указано NOWAIT или времето за изчакване е изтекло

  5. Oracle Pro*C/OCI инсталационни манипулатори за SIGSEGV/SIGABRT и приятели – защо и как да деактивирате?