0

我有一个表,其中用户的 logtime 状态为 1 和 2。如果状态为 1,则它在 logIn 时间,如果状态为 2,则它是 logOut 时间。

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

这是关于表结构和查询的示例演示......

我得到所有logIn时间的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
4

2 回答 2

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

大多数外部查询获取所有检查,第一个子查询(外部)在签入后获取最小签出,第二个子查询(最内部)只是检查之后是否有签入 - 在第三行中设置 NULL 而不是重复 14:59

SQLFiddle 演示

于 2013-06-12T09:16:25.470 回答
0

使用样式 22 的CONVERT功能:

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)
于 2013-06-12T09:10:34.577 回答