我遇到同样的问题
但差别不大。我有2个这样的表:
table employee
emp_id emp_name emp_birth_date
123456 sacha 18/07/1980
使用此查询
create table employee (emp_id char(10), emp_name char(10), emp_birth_date date);
insert into employee values ('123456', 'sacha', (TO_DATE('18/07/1980', 'dd/mm/yyyy')));
和表部门
table dept
emp_id emp_reg_date emp_time_in emp_time_off
123456 25/12/2011 10:00:00 19:00:00
使用此查询
create table dept (emp_id char(10), emp_reg_date date, emp_time_in char(10), emp_time_off char(10));
insert into dept values ('123456', (TO_DATE('25/12/2011', 'dd/mm/yyyy')), '10:00:00', '19:00');
除了birth_date和reg_date
之外,所有数据类型都是char我可以使用此查询显示emp_id,emp_name,emp_reg_date,emp_time_in,emp_time_off select employee.emp_id, employee.emp_name, dept.emp_date_reg, dept.emp_time_in, dept.emp_time_off from employee, dept where employee.emp_id = dept.emp_id;
但如何计算一天和一个月的emp_time_in和emp_time_off表格部门的总时间?
答案 0 :(得分:1)
多么可怕的设计;是什么让你创建了EMP_TIME_IN和EMP_TIME_OFF VARCHAR2列?那应该是DATE的。我建议你改变它。
同时,您必须连接EMP_REG_DATE以及那些IN和OFF列以获取DATE值;然后,通过减去两个日期,你可以获得DAYS的数量,并且 - 使用一点点数学 - 获得你想要的小时,分钟或其他任何日期。
例如:
SQL> create table test
2 (empno number,
3 emp_reg_date date,
4 emp_time_in varchar2(10),
5 emp_time_off varchar2(10));
Table created.
SQL> insert into test values (1, date '2018-03-20', '10:00', '19:00');
1 row created.
SQL> insert into test values (1, date '2018-03-21', '11:30', '12:30');
1 row created.
SQL> insert into test values (2, date '2018-03-25', '13:00', '16:20');
1 row created.
员工1工作9小时+ 1小时=总共10小时。 员工2工作3小时20分钟。
SQL> with dates as
2 (select
3 empno,
4 to_date(to_char(emp_reg_date, 'dd.mm.yyyy') || emp_time_in , 'dd.mm.yyyy hh24:mi') date_in,
5 to_date(to_char(emp_reg_date, 'dd.mm.yyyy') || emp_time_off, 'dd.mm.yyyy hh24:mi') date_off
6 from test
7 ),
8 summary as
9 (select empno,
10 sum(date_off - date_in) diff_days
11 from dates
12 group by empno
13 )
14 select empno,
15 trunc(diff_days * 24) hours,
16 round((diff_days * 24 - trunc(diff_days * 24)) * 60) minutes
17 from summary;
EMPNO HOURS MINUTES
---------- ---------- ----------
1 10 0
2 3 20
SQL>
请注意,实际上无法控制您输入VARCHAR2列TIME_IN和TIME_OUT的内容;是什么阻止你进入AX:FM或99:45或A-b-e_XF?所有这些都是有效的字符串,但无效的时间。
再次:修复数据模型。