计算oracle中的总时间

时间:2018-03-31 06:42:01

标签: oracle oracle11g

我遇到同样的问题

  

how to calculate sum time with data type char in oracle

但差别不大。我有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表格部门的总时间?

1 个答案:

答案 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?所有这些都是有效的字符串,但无效的时间。

再次:修复数据模型。