需要sql查询中的帮助,根据mysql中基于列类型的单个表中列之间的差异查找小时数总和吗

需要sql查询中的帮助,根据mysql中基于列类型的单个表中列之间的差异查找小时数总和吗,mysql,Mysql,目前,我们在mysql中有一个表,其定义如下 CREATE TABLE `tblStaffLog` ( `SlNo` Int( 11 ) AUTO_INCREMENT NOT NULL, `UserName` VarChar( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `PageName` VarChar( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

目前,我们在mysql中有一个表,其定义如下

CREATE TABLE `tblStaffLog` ( 
`SlNo` Int( 11 ) AUTO_INCREMENT NOT NULL,
`UserName` VarChar( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`PageName` VarChar( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`LogType` VarChar( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`Extension` VarChar( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`LogTime` DateTime NOT NULL,
`IPAddress` VarChar( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`activity` VarChar( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
`reason` VarChar( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL,
PRIMARY KEY ( `SlNo` ) )
我们需要计算特定日期的总工作小时数,为此,我们需要将具有值logout的LogType列减去具有值LogIn的前一个LogType列。下面列出了一天的示例行

 SlNo    UserName   LogType     LogTime
355034  Krishna     LogIn   2018-04-01 08:02:32
355036  Krishna     LogOut  2018-04-01 08:50:28
355041  Krishna     LogIn   2018-04-01 09:19:31
355048  Krishna     LogOut  2018-04-01 10:03:16
355051  Krishna     LogIn   2018-04-01 10:12:12
355060  Krishna     LogOut  2018-04-01 11:07:48
355064  Krishna     LogIn   2018-04-01 11:20:01
355072  Krishna     LogOut  2018-04-01 12:33:52
355073  Krishna     LogIn   2018-04-01 12:35:19
355082  Krishna     LogOut  2018-04-01 13:10:02
355083  Krishna     LogIn   2018-04-01 13:14:07
355098  Krishna     LogOut  2018-04-01 17:02:06

如何编写sql查询以获取一天的总工作小时数

您可以使用子查询来获取与登录相关联的注销,并使用一些日期函数来计算总工作小时数。下面的查询说明了这是如何工作的,如果您愿意,您可以重新调整它以使其更高效

drop table if exists t;

CREATE TABLE `t` ( 
`SlNo` Int( 11 ) AUTO_INCREMENT NOT NULL,
`UserName` VarChar( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`LogType` VarChar( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`LogTime` DateTime NOT NULL,
PRIMARY KEY ( `SlNo` ) );
insert into t (username,logtype,logtime) values
( 'Krishna'  ,   'LogIn'  , '2018-04-01 08:02:32'),
('Krishna'  ,   'LogOut' , '2018-04-01 08:50:28'),
('Krishna'  ,   'LogIn'  , '2018-04-01 09:19:31'),
('Krishna'  ,   'LogOut' , '2018-04-01 10:03:16'),
( 'Krishna'  ,   'LogIn'  , '2018-05-01 08:02:32'),
( 'Krishna'  ,   'LogOut' , '2018-05-01 08:50:28'),
( 'Krishna'  ,   'LogIn'  , '2018-05-01 09:19:31'),
( 'Krishna'  ,   'LogOut' , '2018-05-01 10:03:16'),
( 'bob'  ,   'LogIn'  , '2018-05-01 08:02:32'),
( 'bob'  ,   'LogOut' , '2018-05-01 08:50:28'),
( 'bob'  ,   'LogIn'  , '2018-05-01 09:19:31'),
( 'bob'  ,   'LogOut' , '2018-05-01 15:03:16');

select username, dt, sec_to_time(sum(time_to_sec(hrsworked)))
from
(
select  username, date(logtime) dt,logtime logintime,
        (select t1.logtime from t t1 where t1.username = t.username and t1.logtime > t.logtime  and logtype = 'logout' order by logtime limit 1) logout,
      timediff(
        (select t1.logtime from t t1 where t1.username = t.username and t1.logtime > t.logtime  and logtype = 'logout' order by logtime limit 1) ,
        logtime) hrsworked
from t 
where logtype = 'login'
) s
group by username,dt
order by dt,username;

+----------+------------+------------------------------------------+
| username | dt         | sec_to_time(sum(time_to_sec(hrsworked))) |
+----------+------------+------------------------------------------+
| Krishna  | 2018-04-01 | 01:31:41                                 |
| bob      | 2018-05-01 | 06:31:41                                 |
| Krishna  | 2018-05-01 | 01:31:41                                 |
+----------+------------+------------------------------------------+
3 rows in set (0.00 sec)

我们可以说,在一天中登录后,总会有注销?是的,登录后会有注销