oracle处理考勤时间,拆分考勤时间段的sql语句
2015-06-20 20:13
716 查看
最近一直在用mysql数据库做云项目,有段时间没有接触oracle了,昨天有朋友叫我帮忙用oracle处理一个考勤记录的需求,我在考虑如何尽量精简实现上面花了一些时间。于是把这个实现做个总结。
需求如下:
rownum为奇数的为进厂时间,偶数的为离场时间
第一个奇数行的时间被第一个偶数行相减,以此类推
将上面两步产生的时间结果集相加得出总时间作为当天考勤时间
最终能和别的表联合起来形成这样的展示:
要我实现的是如何把时间一列的数据拆分成为两列来显示:
原来一列是这样的:
要实现的拆分的效果是这样的:
实现方式如下:
首先创建一个时间表(当然这里我关注的只是scan_time这个字段,其他字段不用理会):
其次,插入数据,插入数据之后的效果是这样的:
最后编写sql进行实现,实现的sql语句如下所示:
运行sql,得到了想要的效果,如下所示:
需求如下:
rownum为奇数的为进厂时间,偶数的为离场时间
第一个奇数行的时间被第一个偶数行相减,以此类推
将上面两步产生的时间结果集相加得出总时间作为当天考勤时间
最终能和别的表联合起来形成这样的展示:
人员 | 日期 | 工时 | 入厂时间 | 出厂时间 |
张三 | 2015/6/18 | 9小时30分钟 | 8:00:00 | 10:30:00 |
11:00:00 | 12:30:00 | |||
13:30:00 | 17:30:00 | |||
18:00:00 | 18:30:00 | |||
19:00:00 | 19:30:00 | |||
20:00:00 | 20:30:00 | |||
李四 | … | … | .. | .. |
原来一列是这样的:
要实现的拆分的效果是这样的:
实现方式如下:
首先创建一个时间表(当然这里我关注的只是scan_time这个字段,其他字段不用理会):
create table CMIS_PERSON_FI_DETAIL_TB ( detail_id NUMBER(20) not null, scan_time DATE, person_fk_id NUMBER(20) not null )
其次,插入数据,插入数据之后的效果是这样的:
最后编写sql进行实现,实现的sql语句如下所示:
select max(a) in_time, max(b) out_time from (select decode(mod(rownum, 2), 1, scan_time) a, decode(mod(rownum, 2), 0, scan_time) b, round(rownum / 2) c from CMIS_PERSON_FI_DETAIL_TB) group by c order by c;
运行sql,得到了想要的效果,如下所示:
相关文章推荐
- Oracle DB 12c新特性:raw device 裸设备不再受支持
- oracle12c ORA-28040: No matching authentication protocol错误
- Windows 7 64位安装Oracle XE(32位)数据库报错等解决方案
- Oracle重启与关闭 ORA-12528等
- Mysql Oracle Java 数据类型对照
- 组态ORACLE 11G ADG
- Oracle SQL培训教程[清华大学出版…
- MySQL—oracle学习中心
- Oracle SQL的执行过程
- linux下载支持ORACLE软件包pdksh
- RedHat Linux 安装oracle11g(转)
- oracle ora-01652/oracle表空间
- Oracle 数据库安装总结(个人亲测)
- 45 个非常有用的 Oracle 查询语句
- oracle实现自加力id
- Hibernate的HQL使用Oracle的Regexp_like函数的方式
- oracle在imp订单具体解释
- oracle使用sql语句增加字段示例(sql删除字段语句)_oracle
- oracle 11g win7 64位 安装 未找到WFMLRSVCApp.ear
- oracle decode函数