I'm working with a timekeeping application and we have several business rules that apply to night shift hours (hours worked between 1900 and 0700). For each day we have an in and out time for each employee. I need to determine the number of hours between 1900 and 0700.
Example:
CREATE TABLE time_sheets(
id NUMBER NOT NULL,
person_id NUMBER NOT NULL,
start_time DATE,
end_time DATE,
time_code VARCHAR2(10)
);
INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
VALUES(1,50,TO_DATE('4/18/2016 19:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/19/2016 07:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
VALUES(2,50,TO_DATE('4/19/2016 17:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/19/2016 05:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
VALUES(3,50,TO_DATE('4/20/2016 21:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/21/2016 02:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
VALUES(4,50,TO_DATE('4/21/2016 21:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/22/2016 09:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
VALUES(5,50,TO_DATE('4/22/2016 17:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/23/2016 09:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
COMMIT;
If the question is, "how many hours between 1900 and 0700 did employee 50 work on each day", I expect the following answers
4/18/2016 - 12 hours
4/19/2016 - 10 hours
4/20/2016 - 5 hours
4/21/2016 - 10 hours
4/22/2016 - 12 hours
How can I write a query to accomplish this with the given start and stop times?
Can you clarify the second insert for me ?
INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
VALUES(2,50,TO_DATE('4/19/2016 17:00:00','MM/DD/RRRR
HH24:MI:SS'),TO_DATE('4/19/2016 05:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
But without that, is this the kind of thing you were after ?
SQL> drop table time_sheets purge;
Table dropped.
SQL>
SQL> CREATE TABLE time_sheets(
2 id NUMBER NOT NULL,
3 person_id NUMBER NOT NULL,
4 start_time DATE,
5 end_time DATE,
6 time_code VARCHAR2(10)
7 );
Table created.
SQL>
SQL> INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
2 VALUES(1,50,TO_DATE('4/18/2016 19:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/19/2016 07:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
1 row created.
SQL>
SQL> --INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
SQL> --VALUES(2,50,TO_DATE('4/19/2016 07:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/19/2016 17:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
SQL>
SQL> INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
2 VALUES(3,50,TO_DATE('4/20/2016 21:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/21/2016 02:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
1 row created.
SQL>
SQL> INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
2 VALUES(4,50,TO_DATE('4/21/2016 21:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/22/2016 09:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
1 row created.
SQL>
SQL> INSERT INTO time_sheets (ID,PERSON_ID,START_TIME,END_TIME,TIME_CODE)
2 VALUES(5,50,TO_DATE('4/22/2016 17:00:00','MM/DD/RRRR HH24:MI:SS'),TO_DATE('4/23/2016 09:00:00','MM/DD/RRRR HH24:MI:SS'),'TC1');
1 row created.
SQL>
SQL> COMMIT;
Commit complete.
SQL>
SQL> @longdate
Session altered.
SQL>
SQL> select
2 t.*,
3 to_char(trunc(t.start_time),'DD/MM') nominal_day,
4 24*(t.END_TIME - t.start_time) hrs,
5 greatest(19-to_number(to_char(start_time,'HH24')),0) adjust_start,
6 greatest(to_number(to_char(end_time,'HH24'))-07,0) adjust_end
7 from time_sheets t;
ID PERSON_ID START_TIME END_TIME TIME_CODE NOMIN HRS ADJUST_START ADJUST_END
---------- ---------- ------------------- ------------------- ---------- ----- ---------- ------------ ----------
1 50 18/04/2016 19:00:00 19/04/2016 07:00:00 TC1 18/04 12 0 0
3 50 20/04/2016 21:00:00 21/04/2016 02:00:00 TC1 20/04 5 0 0
4 50 21/04/2016 21:00:00 22/04/2016 09:00:00 TC1 21/04 12 0 2
5 50 22/04/2016 17:00:00 23/04/2016 09:00:00 TC1 22/04 16 2 2
SQL>
SQL>