34,498
社区成员




--不晓得对不对
--建表
CREATE TABLE #T
(
id INT IDENTITY(1,1) PRIMARY KEY,
OperationName VARCHAR(10),
ModifiedOn DATETIME,
OperationID VARCHAR(50),
fz INT
)
--插入数据
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('进入','2023-06-01 03:00:38.000','2306010000000000377')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('进入','2023-06-01 03:00:43.000','2306010000000000378')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('进入','2023-06-01 03:00:49.000','2306010000000000379')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('退出','2023-06-01 07:26:22.000','2306010000000000379')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('退出','2023-06-01 07:26:22.000','2306010000000000378')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('退出','2023-06-01 07:28:03.000','2306010000000000377')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('进入','2023-06-01 07:41:21.000','2306010000000000854')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('进入','2023-06-01 07:41:26.000','2306010000000000855')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('进入','2023-06-01 07:41:30.000','2306010000000000856')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('退出','2023-06-01 08:39:18.000','2306010000000000854')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('退出','2023-06-01 08:39:18.000','2306010000000000855')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('退出','2023-06-01 08:39:18.000','2306010000000000856')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('进入','2023-06-01 12:31:53.000','2306010000000001495')
INSERT INTO #T(OperationName,ModifiedOn,OperationID) VALUES('退出','2023-06-01 12:40:15.000','2306010000000001495')
--更新分组,连续的,第一个进入到最后一个退出算一组
DECLARE @i INT =0,@OperationName VARCHAR(10)=''
UPDATE #T SET fz=@i ,@i=@i+IIF(@OperationName<>OperationName AND OperationName='进入',1,0), @OperationName=OperationName
SELECT * FROM #T
--统计
SELECT fz,DATEDIFF(mi, MIN(IIF(OperationName='进入',ModifiedOn,null)),MAX(IIF(OperationName='退出',ModifiedOn,null)) ) AS 分钟数
FROM #T
GROUP BY fz
--删除
DROP TABLE #T
这种属于表没有设计好,给自己找麻烦。
userId loginTime logoutTime
3个字段就可以了。数据多的话还可以设计一个历史表,旧数据可以迁移到历史表。
按你这个,本身就有许多不正常的情况。
比如:有人有进入动作,但没有退出动作,后面的判断就非常麻烦。
你希望不用游标,那循环也是不想用吧,其实不容易做的了,吃力不讨好。
花点时间改下表结构吧
前面要有id吧,不可能是一个用户呀