Cómo restar dos fechas que contengan un parámetro de inicio y fin

Buenas tardes tengo una consulta a ver quien me la puede ayudar a resolver, tengo un tabla que tienen los siguientes datos:

id usuario nombre usuario feha y hora estado huellero 
1 pepito 01/01/2015 08:00 inicio 1 
1 pepito 01/01/2015 10:00 fin 1 
1 pepito 01/01/2015 13:00 inicio 1 
1 pepito 01/01/2015 13:10 fin 1 
1 pepito 01/01/2015 13:50 fin 1 
1 pepito 02/01/2015 08:00 inicio 1 
1 pepito 02/01/2015 20:00 fin 1 
1 pepito 03/01/2015 13:00 inicio 2 
1 pepito 03/01/2015 13:50 fin 2 
2 maria 01/01/2015 08:00 inicio 2 
2 maria 01/01/2015 13:00 fin 2 
2 maria 01/01/2015 21:00 fin 2 
2 maria 02/01/2015 08:00 inicio 2

La idea es que la consulta me diga las horas transcurridas una persona teniendo en cuenta que el fin es cuando encuentre el siguiente inicio y que hay tener en cuenta que pueden ser de diferentes huelleros. Les agradezco me colaboren con esto que lo estoy necesitando urgente. gracias

Hola Me faltaria aclarar qué criterio se sigue para definir lo que es 'inicio', 'fin'. Como primera aproximación yo haría esto, a falta de pulir y optimizar: select [id usuario], datediff(h,a.fecha,b.fecha) [Diferencia en horas] from tabla a join tabla b on a.idusuario=b.idusuario and a.fecha dispositivo lector de huella digital?

buenas noches si señor es un lector de huella para registro de entrada y salida de personal. el ejemplo mas claro que tengo de lo que pasa con el lector es el siguiente: teniendo el ejemplo que coloco las horas deberían decir asi 1 pepito 01/01/2015 08:00 inicio 1 1 pepito 01/01/2015 10:00 fin 1 aquí serian dos horas laboradas el dia 1 1 pepito 01/01/2015 13:00 inicio 1 1 pepito 01/01/2015 13:10 fin 1 1 pepito 01/01/2015 13:50 fin 1 en este ejemplo como la persona timbro dos veces debería de restar es el ultimo fin es decir ahí serian 50 min, porque pasa esto porque una persona se equivoco, o porque no marco, o porque salio al otro dia, en fin son muchas variables es por ello que la resta debe comenzar donde encuentra un unicio con el fin que esta antes de otro inicio. se que se ve complicado pero esta es la realidad de lo que tocaria hacer en la consulta.

En respuesta a por ariel

Entonces, asumiendo que de cada día lo que te interesa es el primer fichaje de inicio y el último fichaje de fin, podrías solventar el problema de los registros de más modificando la consulta anterior por algo así:

select a.id, a.usuario, a.dia datediff(h,a.fecha,b.fecha) [Diferencia en horas] from (select id, usuario, estado, year(fecha)*10000+month(fecha)*100+day(fecha) dia, min(fecha) from tabla_fichajes          where estado='inicio'
         group by id, usuario, estado, year(fecha)*10000+month(fecha)*100+day(fecha) ) tabla a

join (select id, usuario, estado, year(fecha)*10000+month(fecha)*100+day(fecha) dia, max(fecha)
        from tabla_fichajes 
        where estado='fin'
        group by id, usuario, estado, year(fecha)*10000+month(fecha)*100+day(fecha)) tabla b on a.idusuario=b.idusuario and a.dia=b.dia

Con esto, si no me equivoco, te quedarías en las tablas a y b con sólo el primer y el último fichaje diario de cada usuario, independientemente del huellero que utilicen, ¿es más o menos lo que buscabas?