我有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之间的差异。
我有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之间的差异。
像这样的东西应该工作。这只是一个黑客;你会更好地更改基表以在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
它的工作原理... Thankyou如此之多 – Beginner
转换的时间,以分数小时:
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
select time_out - time_in - case when mod(time_in,1) > mod(time_out,1) then 0.4 else 0 end
from t
第一个版本更好 - 易于阅读和理解,易于维护。想到“自我记录”。 – mathguy
@mathguy,我同意。 –
你在MySQL,SQL Server和Oracle这样做呢?三个全部?如果没有,请编辑您的文章并删除不适用的标签。如果您不知道plsql是什么,请删除它。 (或者如果你知道,并且你认识到这个问题与PL/SQL无关。) – mathguy
Time_In和Time_Out是NUMBER数据类型? 12.40是什么意思?你只是输入时间作为十进制数,所以如果时间是12:40你会输入12.4?很奇怪!那么 - “时代”总是保证有效的时间,所以你永远不会有13.83或42.04?他们总是在同一天,并且time_out总是大于或等于time_in?最重要的是,**为什么是NUMBER数据类型的两列而不是正确的数据类型DATE **? – mathguy
其实我正在处理一个PL/SQL程序,它需要生物识别数据给这个time_in和time_out,我只需要一个公式来计算工作时间。 – Beginner