В соответствии с вашим примером вывода я изменил свой запрос и проверил, что он возвращает ожидаемый набор результатов
select t1.logintime,t2.logoutime from
(
select F1.logintime,F1.rank from
(
select
t.logintime,
CASE WHEN @prevRank = logintime THEN @currRank
WHEN @prevRank := logintime THEN @currRank := @currRank + 1
END AS rank
from (
select min(login_time) as logintime from time_table
group by hour(login_time)
) t
cross join (SELECT @currRank := 0, @prevRank := NULL) r
) as F1
) t1
inner join
(
select F2.logoutime,F2.rank from
(
select
t.logoutime,
CASE WHEN @preRank = logoutime THEN @curRank
WHEN @preRank := logoutime THEN @curRank := @curRank + 1
END AS rank
from (
select min(logout_time) as logoutime from time_table
group by hour(logout_time)
) t
cross join (SELECT @curRank := 0, @preRank := NULL) r
) F2
) as t2
on t1.rank = t2.rank