2016-11-18 9 views
-1

Ich habe eine Tabelle, die das Datum und die Uhrzeit speichert, zu der eine Aufgabe beginnt und endet, und basierend auf der Anzahl der geleisteten Stunden wird die Zahlung am Monatsende vorgenommen.Berechnung der Arbeitszeit in Orakel

Die Vorgangsdauer unterscheidet sich von 2 Stunden bis 3 Tage.

Die Arbeitszeit eines Tages beträgt 8 Stunden.

Ich muss die Anzahl der Arbeitsstunden an einem Tag finden.

Die in meiner db gespeicherten Daten wie diese

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 | 

ich die gesamten Arbeitsstunden erhalten müssen, die 36:30 Stunden und wandeln es als 5 Tage Tage.

Wenn ich meine Abfrage ausgeführt habe, konnte ich diese Ausgabe erhalten.

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| 

Meine Frage:

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

Meine gewünschte Ausgabe ist

|Total_no_days| 
--------------- 
| 5   | 

Aber ich bin nicht bewusst, wie jetzt, um fortzufahren. Jemand bitte helfen.

+1

Ich verstehe nicht, warum es 5 Tage werden wird. Bedeuten Sie einfach für jeden Datensatz, bis zum nächsten Tag, wenn "time" in time_diff weniger als 8:00:00 ist? –

Antwort

0

Sie können nur Daten abziehen und mit 24 multiplizieren, damit Sie Stunden bekommen. Dann dividiere durch 8 und du bekommst deine Arbeitstage.

with d as (select sysdate end_date, sysdate - 2.4 as start_date from dual) 
select (end_date - start_date) * 24/8 from d; 

In der Tat kann man mit 3 multiplizieren:

with d as (select sysdate end_date, sysdate - 2.4 as start_date from dual) 
select (end_date - start_date) * 3 from d; 

Also in Ihrem Fall, dass Sie to_date statt to_timestamp und nur subtrahieren Werte verwenden können.

Ihre Anfrage ist:

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

Worauf bezieht sich '2.4' und warum verwenden wir hier das' sysdate'? –

+0

Ich verwende 'sysdate nur als Beispiel. Es ist äquivalent zu to_date ('18112016 10:00', 'ddmmyyyy hh: mm') 'und' to_date ('16112016 5:00', 'ddmmyyyy hh: mm') '. @TonyRoczz Ich habe die Antwort bearbeitet und die Abfrage hinzugefügt, die den Diff-Wert in den Arbeitstagen zurückgibt. – Kacper

+0

Für mich das Anfangs- und Enddatum, das ich von einer Tabelle herbekomme, wo gebe ich die Tabelle und den Angestellten nicht ein? –

0

Da die start_time und end_time erscheinen der DATE Typ sein, Sie können einfach tun:

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