如何将两行合并为一行以检查状态

时间:2013-06-12 08:46:42

标签: sql sql-server-2008

我有一个表具有用户的日志时间,状态为1& 2。 如果状态为1则为logIn Time,如果状态为2,则为logOut Time。

所以我想显示登录&用户的退出时间。如果没有注销时间,则列值应为null。

这是表格结构和查询中的 Sample Demo ...

我得到所有登录时间显示的logOut时间......

我希望输出为:

CLOCKIN     CLOCKOUT
9:25:41 AM  9:30:41 AM
9:35:41 AM  9:40:41 AM
9:45:41 AM  
10:06:33 AM 2:59:51 PM

2 个答案:

答案 0 :(得分:1)

您可以使用几个相关的子查询来执行此操作:

SELECT   CONVERT(NVARCHAR(20),cin.logtime,108) AS CLOCKIN
        ,CONVERT(NVARCHAR(20),( SELECT MIN(cout.logtime) 
                                FROM table1 cout 
                                WHERE cin.logtime < cout.logtime 
                                AND cout.statusId = 2 
                                AND NOT EXISTS (SELECT * FROM table1 cin2 
                                                WHERE cin2.logtime > cin.logtime 
                                                AND cin2.logtime < cout.logtime 
                                                AND cin2.statusId = 1
                                                )
                                ),108) AS CLOCKOUT
FROM table1 cin
WHERE cin.statusId = 1

大多数外部查询获取所有检查,第一个子查询(外部)获取签入后的最小结账,第二个子查询(大多数内部)只是在之后有签到的时候 - 在第三行中取消而不是重复14时59

<强> SQLFiddle Demo

答案 1 :(得分:0)

CONVERT函数使用样式22:

select convert (varchar (20), cast (getdate() as time) , 22)

或者只是将其插入到您的代码中:

 convert (varchar (20), cast (rt.rt.logTime as time ), 22)
,convert (varchar (20), cast (rt1.rt.logTime as time ), 22)