- 论坛徽章:
- 1
|
最近一直在用mysql数据库做云项目,有段时间没有接触oracle了,昨天有朋友叫我帮忙用oracle处理一个考勤记录的需求,我在考虑如何尽量精简实现上面花了一些时间。于是把这个实现做个总结。
需求如下:
rownum为奇数的为进厂时间,偶数的为离场时间
第一个奇数行的时间被第一个偶数行相减,以此类推
将上面两步产生的时间结果集相加得出总时间作为当天考勤时间
最终能和别的表联合起来形成这样的展示:
要我实现的是如何把时间一列的数据拆分成为两列来显示:
原来一列是这样的:
要实现的拆分的效果是这样的:
实现方式如下:
首先创建一个时间表(当然这里我关注的只是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,得到了想要的效果,如下所示:
|
|