You should consider having the status column as smallint instead of wasting space on storing a varchar. Then make another table to describe this varchar (normalizing data).
I rewrote your sql a bit so the syntax is valid and the hour calculation is more accurate:
;with RowNumbers (RowNum, name, [status], [DateTime])
as
(
select
ROW_NUMBER() over (partition by name order by [DateTime]),
name,
[status],
[DateTime]
from @T
)
INSERT INTO Cost(Name, [Status], [Hours])
select
T1.name,
case T1.[status]
when 0 then 'In'
when 1 then 'Out'
when 2 then 'Absent'
end as [status],
datediff(MINUTE, 0, T2.[DateTime]-T1.[DateTime]) / 60.0 as [hours]
from RowNumbers T1
inner join RowNumbers T2
on T1.RowNum = T2.RowNum - 1 -- joins the current row to the next one
and T1.name = T2.name
order by T1.Name, T1.[status];