在oracle中计算工作时间

在oracle中计算工作时间,oracle,datetime,date-difference,Oracle,Datetime,Date Difference,我有一个表格,其中存储了任务开始和结束的日期和时间,并根据工作小时数在月末付款 任务持续时间从2小时到3天不等 一天的工作时间是8小时 我需要找出一天工作的小时数 存储在数据库中的数据如下所示 sno | start_time | end_time | --------------------------------------------------- 1 |06-10-2016 09:30:00 | 06-10-2016 17:00:00

我有一个表格,其中存储了任务开始和结束的日期和时间,并根据工作小时数在月末付款

任务持续时间从2小时到3天不等

一天的工作时间是8小时

我需要找出一天工作的小时数

存储在数据库中的数据如下所示

sno | start_time            |  end_time           |
---------------------------------------------------
1   |06-10-2016 09:30:00    | 06-10-2016 17:00:00 |
2   |12-10-2016 08:00:00    | 15-10-2016 13:00:00 |
我需要得到总工作时间,即36:30小时,并将其转换为5天的天数

当我运行查询时,我能够得到这个输出

sno | start_time         |   end_time          |  time_diff         |
--------------------------------------------------------------------
1   |06-10-2016 09:30:00 |  06-10-2016 17:00:00| +00 07:30:00.000000|
2   |12-10-2016 08:00:00 |  15-10-2016 13:00:00| +03 05:00:00.000000|
我的问题是:

SELECT  DISTINCT sno,  start_time,end_time, 
TO_TIMESTAMP (end_time,'DD-MM-YYYY HH24:MI:SS') - TO_TIMESTAMP (start_time,'DD-MM-YYYY HH24:MI:SS') AS time_diff
FROM employee WHERE  TO_CHAR((start_time),'MM-YYYY')='10-2016' AND emp_no ='18754';
我期望的输出是

|Total_no_days|
---------------
|  5          |
但我不知道现在该怎么做。
请找个人帮忙。

你可以减去日期,再乘以24,这会给你几个小时。然后除以8,得到你的工作日

with d as (select sysdate end_date, sysdate - 2.4 as start_date from dual)
select (end_date - start_date) * 24 / 8 from d;
事实上,你可以乘以3:

with d as (select sysdate end_date, sysdate - 2.4 as start_date from dual)
select (end_date - start_date) * 3 from d;
因此,在您的例子中,您可以使用
来确定日期
而不是
来确定时间戳
,只需减去值即可

您的查询是:

SELECT  DISTINCT sno,  start_time,end_time, 
(TO_DATE (end_time,'DD-MM-YYYY HH24:MI:SS') - TO_DATE(start_time,'DD-MM-YYYY HH24:MI:SS')) * 3 AS time_diff_work_days
FROM employee WHERE  TO_CHAR((start_time),'MM-YYYY')='10-2016' AND emp_no ='18754';

由于
开始时间
结束时间
似乎属于
日期
类型,您只需执行以下操作:

SELECT  SUM( end_time - start_time ) * 24 / 8 AS Total_no_days
FROM    employee
WHERE   start_time >= DATE '2016-10-01'
AND     start_time <  DATE '2016-11-01'
AND     emp_no ='18754';
选择总和(结束时间-开始时间)*24/8作为总天数
来自员工
其中开始时间>=日期“2016-10-01”
开始时间<日期'2016-11-01'
以及emp_no='18754';

我不明白为什么会变成5天。你的意思是,如果时间差中的“时间”小于8:00:00,那么每个记录都要四舍五入到最近的一天吗?这是指什么?为什么我们在这里使用
sysdate
?我使用
sysdate作为示例。它相当于
to_date('18112016 10:00','ddmmyyyy hh:mm')和to_date('16112016 5:00','ddmmyyyy hh:mm')@TonyRoczz我已经编辑了答案并添加了您的查询,返回工作日内的差异。对于我从表中获取的开始和结束日期,我在哪里提供表和员工编号?