在一个考勤管理的数据表1中,有职工ID‘kqid’(纯数字)、考勤时间kqtime(年:月:日 时:分:秒 )、上下班标志bz(1表示上班,2表示下班) 3个字段,每个职工每天都有若干条上班考勤记录和若干条下班考勤记录例:
kqid kqtime bz
1111 2012/04/01 13:00:00 1
1111 2012/04/01 13:02:00 1
1111 2012/04/01 13:01:00 1
2222 2012/04/01 13:03:00 1
2222 2012/04/01 13:02:00 1
1111 2012/04/01 17:30:00 2
1111 2012/04/01 17:29:00 2
2222 2012/04/01 17:30:00 2
2222 2012/04/01 17:33:00 2
3333 2012/04/01 13:00:00 1
3333 2012/04/01 13:03:00 1
4444 2012/04/01 13:00:00 2
.............此处省略10万条..............
5432 2012/04/15 18:00:00 2
......
求算法,将以上无序数据根据kqid依据每一天的最晚上班时间配最早下班时间的要求进行配对存放到另一表2中,格式如下:
kqid 考勤日期 上班时间 下班时间
1111 2012/04/01 13:02:00 17:29:00
2222 2012/04/01 13:03:00 17:30:00
.......
求配对算法,本人小白,能在程序行后加注释更加感激不尽。
------解决方案--------------------------------------------------------
上传你的DBF到www.access911.net/csdn
,用WINRAR压缩
------解决方案--------------------------------------------------------
用 vfp9 的话一条语句就行了,vfp6 的话可能要分成三条
- SQL code
*-- vfp9 代码Create Cursor kqt (kqid C(4), kqtime T, bz N(1))Insert into kqt (kqid, kqtime, bz) values ('1111', {^2012/04/01 13:00:00}, 1)...Insert into kqt (kqid, kqtime, bz) values ('5432', {^2012/04/15 18:00:00}, 2)*-- 统计结果Select Nvl(a.kqid, b.kqid) As kqid, Nvl(a.dd, b.dd) As 考勤日期, a.tt As 上班时间, b.tt As 下班时间 ; from (Select kqid, Ttod(kqtime) As dd, Max(kqtime) As tt From kqt Where bz=1 Group By 1,2) a; full Join (Select kqid, Ttod(kqtime) As dd, Min(kqtime) As tt From kqt Where bz=2 Group By 1,2) b ; on a.kqid = b.kqid And a.dd = b.dd ; into Cursor result* Browse
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
只要时间部分,改一下:
- SQL code
Select Nvl(a.kqid, b.kqid) As kqid, Nvl(a.dd, b.dd) As 考勤日期, ; Ttoc(a.tt,2) As 上班时间, Ttoc(b.tt,2) As 下班时间 ; from (Select kqid, Ttod(kqtime) As dd, Max(kqtime) As tt From kqt Where bz=1 Group By 1,2) a; full Join (Select kqid, Ttod(kqtime) As dd, Min(kqtime) As tt From kqt Where bz=2 Group By 1,2) b ; on a.kqid = b.kqid And a.dd = b.dd ; into Cursor result