将时钟输入和时钟输出数据分开存储在一列中

时间:2014-03-23 07:29:46

标签: c# sql sql-server visual-studio

我遇到了一些问题,即找到一个解决方案来分隔用户进入和退出当前系统的日期和时间。

到目前为止,表格如下:

10412 Users Name 01/11/2012 07:12 10412 Users Name 01/11/2012 17.15 10412 Users Name 04/11/2012 07:47 10412 Users Name 04/11/2012 17:13

在C#环境中使用SQL Server和编程,我需要的主要功能是将两个日期和时间定义到它们自己的列中,而不必重做整个数据库。

非常感谢任何帮助,

提前致谢...

3 个答案:

答案 0 :(得分:0)

由于您没有非常清楚地定义问题,我会选择涵盖您样本的最简单的案例;

如果每天只能进行一次单身登记/结账,简单的GROUP BY将解决问题;只需每天的最短时间作为结账时间和结账时间的最长时间。

SELECT user_id, user_name, MIN(clock_time) clock_in, MAX(clock_time) clock_out
FROM myTable
GROUP BY user_id, user_name, DATEPART(yy, clock_time), DATEPART(y,  clock_time)

An SQLfiddle to test with

答案 1 :(得分:0)

我认为最简单的方法是枚举列然后按对进行聚合。这使用row_number()函数:

select userId, userName, min(clocktime) as clock_in, max(clocktime) as clockout     
from (select t.*,
             row_number() over (partition by userId, userName order by clocktime) as seqnum
      table t
     ) t
group by userid, userName, (seqnum - 1) / 2;

请注意,SQL Server执行整数运算,因此3/2为1而不是1.5。

答案 2 :(得分:0)

        SqlDataAdapter sda1 = new SqlDataAdapter("SET ROWCOUNT 10 SELECT USERINFO.USERID [User ID], USERINFO.NAME [Name], USERINFO.DEFAULTDEPTID [Dept.],CONVERT(VARCHAR(10),CHECKINOUT.CHECKTIME,103) [Date], MIN(CONVERT (VARCHAR(5),CHECKINOUT.CHECKTIME,108)) [Clock In], MAX(CONVERT (VARCHAR(5),CHECKINOUT.CHECKTIME,108)) [Clock Out] FROM USERINFO ,CHECKINOUT where USERINFO.USERID = CHECKINOUT.USERID GROUP BY USERINFO.USERID, USERINFO.NAME, USERINFO.DEFAULTDEPTID, CONVERT(VARCHAR(10),CHECKINOUT.CHECKTIME, 103)", con);
        sda1.Fill(dta);
        dataGridView1.DataSource = dta;

通过大量的努力和代码过滤,我能够创造出完美的“时钟输入/输出”功能。我的计划的功能,谢谢你所有的帮助...