计算oracle中的工作时间

时间:2016-11-18 07:39:22

标签: 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   |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          |

但我不知道现在该怎么办。 有人请帮忙。

2 个答案:

答案 0 :(得分:0)

你可以减去日期并乘以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;

因此,在您的情况下,您可以使用to_date代替to_timestamp,只需减去值。

您的查询是:

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';

答案 1 :(得分:0)

由于start_timeend_time似乎属于DATE类型,您可以这样做:

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';