我遇到了一些问题,即找到一个解决方案来分隔用户进入和退出当前系统的日期和时间。
到目前为止,表格如下:
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和编程,我需要的主要功能是将两个日期和时间定义到它们自己的列中,而不必重做整个数据库。
非常感谢任何帮助,
提前致谢...
答案 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)
答案 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;
通过大量的努力和代码过滤,我能够创造出完美的“时钟输入/输出”功能。我的计划的功能,谢谢你所有的帮助...