我在做一个考勤的程序,遇到点问题我通过select语句获得了一个datatable 里面有3列 USERID DATE TIME, 每个ID每天打卡若干次,TIME记录每次打卡的时间。我现在希望希望统计每个USERID在每一个DATE中的出勤总时间。奇数次算进,偶数次算出,暂时不考虑漏打卡的。也就是说最终得到一个datatable,也是3列 USERID DATE TOTALATTENDANCE, 其中每个USERID的每个DATE占一行,TOTALATTENDANCE记录当天总共出勤小时数。我才学C#不久,不知道如何对datatable进行操作才能得到我想要的。不知道该如何操作。

解决方案 »

  1.   

    select USERID,DATE,sum(TIME) as TOTALATTENDANCE from 表名 group by userid,date
    大概的路子就是这样,楼主试试吧。
      

  2.   

    想了一个不太成熟的方法,不知对LZ有没有帮助 :
    数据库加两个字段Tag,state,在每次进的时候(奇数次)写入数据库之前,生成一个自动增加的数值,加入Tag,state=1,出的时候Tag也是该值,state=0,下次进的时候,Tag值加1.
    那么可以用这个查询 select USERID,DATE,tag,(SELECT TOP 1 time FROM table AS b WHERE b.tag = a.tag AND b.state = 0) -(SELECT TOP 1 time FROM table AS c WHERE c.tag = a.tag AND c.state = 1) AS Expr1 
    from table as a
    group by userid,date,tag
      

  3.   

    可能有些数据库中的sql不能用 time 值相减,LZ 可以用相应的函数代替,我刚刚是用的两个 Int字段试的,通过
      

  4.   

    这个其实主要是逻辑问题,你把逻辑理解清楚了就好了,代码倒不是很难,我们公司是用lotus做的考勤系统。
      

  5.   

    我想各位理解错我的意思了,我不关心出勤的计算,这个我们已经有一套计算方法了,我关心的是如何将第一张datatable通过这种方法转换成第二张datatable。我当时想的是建立两个临时试图,第一张放某个ID的 date和time, 这张表可以通过select得到。第二张试图放某个ID在某一天的time,这个也是用select得到,然后对第二张临时表进行计算得到当天的出勤。我现在遇到的问题是,不知道如何建立和临时存放这两个视图,我不能放在sql server里,只能以c#的datatable存放,但是我没学过如何在datatable上进行sql操作。我知道操作数据库得到datatable的方法,用sqlcommand就可以,但是如果对象不是数据库中的表是一个datatable,我就不会了。
    这是我的问题。
      

  6.   

    DataTable有个Select()方法
    用找个可以计算
    DataTable mydt ;
    mydt=FillMyData();//填充你的数据到mydt 里
    int count=mydt.Select("Userid="+ +" and Date ="+).length ;
    if count%2=0
    ...
    else 
    ...