日期:2014-05-18  浏览次数:20460 次

请教关于一个考勤系统的统计
首先,这个考勤系统已经做好的了!无法修改!
table: 
姓名 打卡时间
甲 2008-7-27 8:00
乙 2008-7-27 9:00
甲 2008-7-28 8:15
丙 2008-7-28 8:23
。。。。。
并不是每个人每天都打卡的。。
要的统计效果:可以选择统计的时间段:比如是2008-7-1到2008-7-20
时间 星期 甲 乙 丙 。。。。。。
2008-7-1 星期二 8:01 8:12 9:01 。。。。
2008-7-2 星期三 无打卡 8:15 无打卡。。。。
。。。。。
以此类推,没有打卡的也列出来。。。
这样的sql语句应该怎么写??gridview应该怎么列出来??谢谢!

------解决方案--------------------
要得到你罗列的效果恐怕做不出来.你原来的表结构设计的跟结果不相符,表的数据成为结果里的列名不是很好做.
可以做成这样的
姓名 时间 日期
甲 8:00 2007-7-1
乙 9:00 2007-7-1
丙 未打卡 2007-7-1

甲 未打卡 2007-7-2
乙 8:05 2007-7-2
丙 9:00 2007-7-2

一天一天的来。
------解决方案--------------------
这个就是“交叉表”的功能啊
给你一个例子
http://publish.it168.com/2005/1105/20051105001501.shtml?cChanNel=11&cpositioncode=296&hezuo=29
------解决方案--------------------
搜下,行转列

大把大把的


使用case语句
------解决方案--------------------
不难呀。。就是在SQL语句中处理一下即可,读取某个用户某天的打卡时间写在一个函数里,把用户的ID和时间做入参数传入。。。
------解决方案--------------------
SQL code

    --一周内的统计
    declare @startTime dateTime
    declare @endTime dateTime
    set @startTime=REPLACE(CONVERT(varchar(10),DateAdd(day,-7,DATEADD(Day,2-DATEPART(Weekday,getdate()),getdate())),120),N'-0','-')
    set @endTime=REPLACE(CONVERT(varchar(10),DateAdd(day,-1,DATEADD(Day,2-DATEPART(Weekday,getdate()),getdate())),120),N'-0','-')
    declare @temp table(XX XX....)
    while(@startTime<=@endTime)
      begin
        insert into @temp
           select ...
     end