2016-11-27 3 views
1

У меня номер time_in (7,2): = 12,40Расчет десятичной разницы в формате минут

и номер time_out (7,2): = 23,05

и номер Total_Hours (7,2) = time_out -Time_In

и результат будет Total_Hours = 10,65, который должен быть 10,25

Может кто-то дать мне SQL запрос, чтобы вычислить разницу между time_in и time_out.

+0

Вы делаете это на MySQL, SQL Server И Oracle? Все три? Если нет, пожалуйста, удалите сообщение и удалите теги, которые не применяются. И если вы не знаете, что такое plsql, удалите это. (Или, если вы знаете, и вы понимаете, что вопрос не имеет ничего общего с PL/SQL.) – mathguy

+1

Time_In и Time_Out - NUMBER тип данных? Что означает 12.40? Вы просто вводите время как десятичное число, поэтому, если время 12:40, вы будете вводить 12.4? Очень странно! Тогда - всегда ли «времена» всегда будут действительными, поэтому у вас никогда не будет 13,83 или 42,04? Всегда ли они в одну дату, а time_out всегда больше или равно time_in? Самое главное, ** почему два столбца типа данных NUMBER, а не правильный тип данных, DATE **? – mathguy

+0

На самом деле я работаю над процедурой PL/SQL, которая берет биометрические данные, которые дают time_in и time_out, как это, мне просто нужна формула для расчета отработанных часов. – Beginner

ответ

1

Что-то вроде этого должно работать. Это просто взломать; вам лучше было бы изменить базовую таблицу для хранения времени в типе данных DATE.

Идея состоит в том, что минуты минутного времени меньше, чем на time_in, чтобы вычесть 1 из часов в time_out и добавить 60 минут. Это так же, как вычитание 0,4 при работе с десятичными знаками. Так что это именно то, что делает решение.

Итак, да, это можно сделать, и это легко сделать - это просто не то, что нужно делать. Удачи!

with 
    inputs (time_in, time_out) as (
     select 9.45, 12.06 from dual union all 
     select 10.20, 14.02 from dual 
    ) 
select time_in, time_out, 
     case when time_out - trunc(time_out) >= time_in - trunc(time_in) 
        then time_out - time_in 
      else time_out - time_in - 0.4 end as difference 
from inputs; 


TIME_IN TIME_OUT DIFFERENCE 
    9.45  12.06  2.21 
    10.2  14.32  4.12 
+0

Это работает ... Thankyou So much – Beginner

0

Преобразование часов дробных часов:

select (trunc(time_out) + (time_out - trunc(time_out))/60) + 
     trunc(time_in) + (time_in - trunc(time_in))/60) 
     ) as diff_in_hours 

. . . 

Вы можете преобразовать это назад к вашей тайной записи. Вот один способ:

select trunc(diff_in_hours) + (diff_in_hours - trunc(diff_in_hours) * 60/100 
from (select (trunc(time_out) + (time_out - trunc(time_out))/60) + 
       trunc(time_in) + (time_in - trunc(time_in))/60) 
      ) as diff_in_hours 
     . . . 
    ) x 
1
select time_out - time_in - case when mod(time_in,1) > mod(time_out,1) then 0.4 else 0 end 
from t    
+0

Первая версия намного лучше - легко читается и понятна, проста в обслуживании. «Самодокументирующийся» приходит на ум. – mathguy

+0

@mathguy, я согласен. –

Смежные вопросы