Вот основной подход, если у вас есть только даты начала и окончания.Я не совсем понимаю, как вписывается позиция входа в систему, поэтому вам нужно будет более четко объяснить, какой вывод вы хотите получить, или возиться с запросом, чтобы удовлетворить вас.Кроме того, запрос находится на сервере SQL, поскольку у меня не установлен MySQL - извините!
CREATE TABLE LogTable
(
id int IDENTITY,
userId nvarchar(20),
logDate datetime,
position nvarchar(5)
)
GO
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-01', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-02', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-05', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User1', '2001-01-08', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-01', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-03', 'end')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-06', 'start')
INSERT INTO LogTable (userId, logDate, position) VALUES ('User2', '2001-01-07', 'end')
GO
SELECT log1.userId, log1.logDate AS [start], log2.logDate AS [end],
DATEDIFF(d, log1.logDate, log2.logDate) AS [Diff. in Days]
FROM LogTable log1 JOIN
LogTable log2 ON log1.userId = log2.userId
WHERE log1.position = 'start'
AND log2.position = 'end'
AND log2.logDate > log1.logDate
AND NOT EXISTS (
SELECT *
FROM LogTable logDateCheck
WHERE logDateCheck.userId = log1.userId
AND logDateCheck.logDate >= log1.logDate
AND logDateCheck.logDate <= log2.logDate
AND logDateCheck.id NOT IN (log1.id, log2.id))
GO
Вывод: