Stack Exchange
Restar 3 columnas de horas en sentencia sql
Vengo con la siguiente duda, tengo los datos que recibo de mi biométrico, los cuales son 3 valores, hora de entrada, hora de salida y hora de almuerzo en este ejemplo le asigno un valor estático, realizo el query en SQL Server Management Studio el cual con la función DATEDIFF me permite realizar la resta de los 2 primeros valores, pero el resultado que me arroja se visualiza en un numero entero.
Primera duda : Que debería cambiar o añadir para que me visualice el resultado en formato hora ejemplo 05h50 que seria el resultado de la primera fila
Segunda duda : Como puedo obtener en una sola operación la resta de los 3 valores que seria 05h20 el resultado final
Tercera duda: Si el resultado de la resta de la entrada y salida da menor a 04h00, no debería ser restado el valor de almuerzo.
Aquí el query que forma parte de un procedimiento almacenado.
if Object_id('TEMPDB..#TEMPTABLA') is not null
  begin
      drop table #temptabla;
  end

create table #temptabla
  (
     cod    int,
     fec    date,
     horent time,
     horsal time,
     horcom time,
     tothor time,
     sec    int
  );

insert into #temptabla
            (cod,
             fec,
             horent,
             horsal,
             horcom,
             tothor,
             sec)
select horcal_cod,
       horcal_fecini,
       horcal_ent_1,
       horcal_sal_1,
       '00:30',
       Datediff(hour, horcal_ent_1, horcal_sal_1),
       horcal_sec
from   tbl_horcal

insert into #temptabla
            (cod,
             fec,
             horent,
             horsal,
             horcom,
             tothor,
             sec)
select horcal_cod,
       Dateadd(day, 1, horcal_fecini),
       horcal_ent_2,
       horcal_sal_2,
       '00:30',
       Datediff(minute, horcal_ent_2, horcal_sal_2),
       horcal_sec
from   tbl_horcal

insert into #temptabla
            (cod,
             fec,
             horent,
             horsal,
             horcom,
             tothor,
             sec)
select horcal_cod,
       Dateadd(day, 2, horcal_fecini),
       horcal_ent_3,
       horcal_sal_3,
       '00:30',
       Datediff(minute, horcal_ent_3, horcal_sal_3),
       horcal_sec
from   tbl_horcal

insert into #temptabla
            (cod,
             fec,
             horent,
             horsal,
             horcom,
             tothor,
             sec)
select horcal_cod,
       Dateadd(day, 3, horcal_fecini),
       horcal_ent_4,
       horcal_sal_4,
       '00:30',
       Datediff(minute, horcal_ent_4, horcal_sal_4),
       horcal_sec
from   tbl_horcal

insert into #temptabla
            (cod,
             fec,
             horent,
             horsal,
             horcom,
             tothor,
             sec)
select horcal_cod,
       Dateadd(day, 4, horcal_fecini),
       horcal_ent_5,
       horcal_sal_5,
       '00:30',
       Datediff(minute, horcal_ent_5, horcal_sal_5),
       horcal_sec
from   tbl_horcal

insert into #temptabla
            (cod,
             fec,
             horent,
             horsal,
             horcom,
             tothor,
             sec)
select horcal_cod,
       Dateadd(day, 5, horcal_fecini),
       horcal_ent_6,
       horcal_sal_6,
       '00:30',
       Datediff(minute, horcal_ent_6, horcal_sal_6),
       horcal_sec
from   tbl_horcal

insert into #temptabla
            (cod,
             fec,
             horent,
             horsal,
             horcom,
             tothor,
             sec)
select horcal_cod,
       Dateadd(day, 6, horcal_fecini),
       horcal_ent_7,
       horcal_sal_7,
       '00:30',
       Datediff(minute, horcal_ent_7, horcal_sal_7),
       horcal_sec
from   tbl_horcal

select cod,
       fec,
       horent,
       horsal,
       horcom,
       tothor,
       sec
from   #temptabla
where  horent is not null
group  by cod,
          fec,
          horent,
          horsal,
          sec,
          tothor,
          horcom
order  by cod; 

La primera linea me arroja el siguiente error Mens. 206, Nivel 16, Estado 2, Línea 5 Conflicto de tipos de operandos: int es incompatible con time
Al visualizar el resultado solo haciendo la consulta me arroja lo que se ve en la imagen descrita abajo, por lo tanto es donde me encuentro un poco perdido al no saber como se puede realizar y el resultado lo arroje en horas.
Aquí el resultado que arroja el sql

De antemano agradezco su ayuda y guía.

Tengo tres dudas sobre tu pregunta: 1. ¿En qué SGBD estás trabajando (MySQL, SQL Server, PostgreSQL, Oracle, etc)? 2. Hablas de una Stored Procedure, pero ¿cuál es el código completo de tu Stored Procedure? 3. ¿Qué has investigado / intentando de las tres cosas que preguntas y qué problemas tienes implementando lo que has investigado? Pulsa en [edit] y completa tu pregunta.

Modifique la pregunta, ahora si tiene mas informacion para que se entienda de mejor manera

Después de varios días de haber probado adjunta la respuesta para quienes necesiten realizar lo mismo.
IF OBJECT_ID('TEMPDB..#TEMPTABLA') IS NOT NULL BEGIN DROP TABLE #TEMPTABLA;END 
    CREATE TABLE #TEMPTABLA
    (ID INT,COD INT,FEC DATE, HORENT TIME,HORSAL TIME,HORPRE TIME,HORCOM TIME,SEC INT,TIPH VARCHAR(2),VH NUMERIC(18,2),
    FECINI DATE, FECFIN DATE,ELAB DATETIME);
INSERT INTO #TEMPTABLA(ID,COD,FEC, HORENT,HORSAL,HORPRE,HORCOM,SEC,TIPH,VH,FECINI,FECFIN,ELAB) 
    SELECT horcal_id, horcal_cod,
    horcal_fecini, 
    horcal_ent_1,horcal_sal_1,
    CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,horcal_ent_1,horcal_sal_1),0) AS TIME),
    horcal_alm,
    horcal_sec,
    'HN',
    S.HORA_NORMAL,
    horcal_fecini,
    DATEADD(DAY,6,horcal_fecini),
    GETDATE()
    FROM TBL_HORCAL 
    INNER JOIN TBL_SECCION AS S ON horcal_sec = S.ID_CODIGO
INSERT INTO #TEMPTABLA(ID,COD,FEC, HORENT,HORSAL,HORPRE,HORCOM,SEC,TIPH,VH,FECINI,FECFIN,ELAB)
    SELECT horcal_id, horcal_cod,
    DATEADD(DAY,1,horcal_fecini), 
    horcal_ent_2,horcal_sal_2,
    CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,horcal_ent_2,horcal_sal_2),0) AS TIME),
    horcal_alm,
    horcal_sec,
    'HN',
    S.HORA_NORMAL,
    horcal_fecini,
    DATEADD(DAY,6,horcal_fecini),
    GETDATE()
    FROM TBL_HORCAL 
    INNER JOIN TBL_SECCION AS S ON horcal_sec = S.ID_CODIGO
INSERT INTO #TEMPTABLA(ID,COD,FEC, HORENT,HORSAL,HORPRE,HORCOM,SEC,TIPH,VH,FECINI,FECFIN,ELAB)
    SELECT horcal_id, horcal_cod,
    DATEADD(DAY,2,horcal_fecini), 
    horcal_ent_3,horcal_sal_3,
    CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,horcal_ent_3,horcal_sal_3),0) AS TIME),
    horcal_alm,
    horcal_sec,
    'HN',
    S.HORA_NORMAL,
    horcal_fecini,
    DATEADD(DAY,6,horcal_fecini),
    GETDATE()
    FROM TBL_HORCAL 
    INNER JOIN TBL_SECCION AS S ON horcal_sec = S.ID_CODIGO
INSERT INTO #TEMPTABLA(ID,COD,FEC, HORENT,HORSAL,HORPRE,HORCOM,SEC,TIPH,VH,FECINI,FECFIN,ELAB)
    SELECT horcal_id, horcal_cod,
    DATEADD(DAY,3,horcal_fecini), 
    horcal_ent_4,horcal_sal_4,
    CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,horcal_ent_4,horcal_sal_4),0) AS TIME),
    horcal_alm,
    horcal_sec,
    'HN',
    S.HORA_NORMAL,
    horcal_fecini,
    DATEADD(DAY,6,horcal_fecini),
    GETDATE()
    FROM TBL_HORCAL 
    INNER JOIN TBL_SECCION AS S ON horcal_sec = S.ID_CODIGO
INSERT INTO #TEMPTABLA(ID,COD,FEC, HORENT,HORSAL,HORPRE,HORCOM,SEC,TIPH,VH,FECINI,FECFIN,ELAB)
    SELECT horcal_id, horcal_cod,
    DATEADD(DAY,4,horcal_fecini), 
    horcal_ent_5,horcal_sal_5,
    CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,horcal_ent_5,horcal_sal_5),0) AS TIME),
    horcal_alm,
    horcal_sec,
    'HN',
    S.HORA_NORMAL,
    horcal_fecini,
    DATEADD(DAY,6,horcal_fecini),
    GETDATE()
    FROM TBL_HORCAL 
    INNER JOIN TBL_SECCION AS S ON horcal_sec = S.ID_CODIGO
INSERT INTO #TEMPTABLA(ID,COD,FEC, HORENT,HORSAL,HORPRE,HORCOM,SEC,TIPH,VH,FECINI,FECFIN,ELAB)
    SELECT horcal_id, horcal_cod,
    DATEADD(DAY,5,horcal_fecini), 
    horcal_ent_6,horcal_sal_6,
    CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,horcal_ent_6,horcal_sal_6),0) AS TIME),
    horcal_alm, 
    horcal_sec,
    'HN',
    S.HORA_NORMAL,
    horcal_fecini,
    DATEADD(DAY,6,horcal_fecini),
    GETDATE()
    FROM TBL_HORCAL 
    INNER JOIN TBL_SECCION AS S ON horcal_sec = S.ID_CODIGO
INSERT INTO #TEMPTABLA(ID,COD,FEC, HORENT,HORSAL,HORPRE,HORCOM,SEC,TIPH,VH,FECINI,FECFIN,ELAB)
    SELECT horcal_id, horcal_cod,
    DATEADD(DAY,6,horcal_fecini), 
    horcal_ent_7,horcal_sal_7,
    CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,horcal_ent_7,horcal_sal_7),0) AS TIME),
    horcal_alm, 
    horcal_sec,
    'HD',
    S.HORA_DOBLE,
    horcal_fecini,
    DATEADD(DAY,6,horcal_fecini),
    GETDATE()
    FROM TBL_HORCAL 
    INNER JOIN TBL_SECCION AS S ON horcal_sec = S.ID_CODIGO
                
;WITH VISTA AS(SELECT ID,COD,FEC,CONVERT(VARCHAR(5), HORENT,108) AS HORENT,CONVERT(VARCHAR(5), HORSAL,108) AS HORSAL,
 CONVERT(VARCHAR(5), HORPRE,108) AS HORPRE,
    CONVERT(VARCHAR(5), HORCOM,108) AS HORCOM,
    (DATEPART(hour, HORPRE) * 60) + (DATEPART(minute, HORPRE)) AS TOTMI,
    case 
    when (DATEPART(hour, HORPRE) * 60) + (DATEPART(minute, HORPRE))<= 240  then 
    CONVERT(VARCHAR(5),CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,HORENT,HORSAL),0) AS TIME),108)
    when (DATEPART(hour, HORPRE) * 60) + (DATEPART(minute, HORPRE))>= 240  then 
    CONVERT(VARCHAR(5), CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,HORCOM,CAST(DATEADD(MINUTE, DATEDIFF(MINUTE,HORENT,HORSAL),0) AS TIME)),0) AS TIME),108)  end AS TOTHOR ,
    SEC,TIPH,VH,FECINI,FECFIN,ELAB
    FROM #TEMPTABLA 
    WHERE HORENT IS NOT NULL
    GROUP BY ID,COD,FEC,HORENT,HORSAL,SEC,HORCOM,HORPRE,VH,TIPH,FECINI,FECFIN,ELAB
    )

    SELECT 
    ID,SEC,COD,FEC,HORENT,HORSAL,HORPRE,HORCOM,TOTHOR,
    REPLACE(CONVERT(NUMERIC(18,2),(CONVERT(NUMERIC(18,2),(DATEPART(hour, TOTHOR) * 60) + (DATEPART(minute, TOTHOR)),0)/60)*VH),'.',',')as VAP,
    TIPH,REPLACE( VH,'.',',') AS VH,'Diurno' as TIPTU,FECINI,FECFIN,ELAB
    FROM VISTA  
    WHERE HORENT <> '00:00' 
    ORDER BY ID 

Si existe alguna mejora para el código por favor me lo hacen saber , de antemano gracias.
