2016-11-27 120 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_out上的分钟数小于time_in时,在time_out上从小时数中减去1并添加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如此之多 – 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,我同意。 –

相关问题