A proposito, ci sono così tanti difetti tecnici nell'elaborazione e nel tipo di dati che stai utilizzando. Il problema reale è qui.
- Nel tuo proc puoi inserire la condizione della data nel primo CTE stesso.
- Se possibile puoi memorizzare extrahour in secondi nella tabella. Ciò significa che Extrahours è int o bigint.like -1000 o 1000.varchar non risolverà mai il tuo problema. Ti salverà da molte conversioni quindi velocemente.
- L'uso di così tante colonne nel gruppo per è di per sé un approccio sbagliato. specialmente usando la colonna varchar nel gruppo per. Dovresti usare la colonna chiave nel gruppo per poi unirti di nuovo alla tabella per ottenere altre colonne nel set di risultati.
con i tuoi dati di esempio ottengo -29:-51:-30.0 invece di -31:50:46 .fallo in questo modo,
DECLARE @t TABLE (ExtraHrs VARCHAR(20))
INSERT INTO @t
VALUES ('00:59:38')
,('-03:59:37')
,('-08:59:39')
,('-08:52:36')
,('-08:59:16');
WITH cte
AS (
SELECT ExtraHrs
,CASE
WHEN left(ExtraHrs, 1) = '-'
THEN - 1
ELSE 1
END AS multiply
,right(ExtraHrs, 8) AS timestring
,
--get hours in seconds:
DATEPART(HOUR, right(ExtraHrs, 8)) * 3600 AS h_in_s
,
--get minutes in seconds:
DATEPART(MINUTE, right(ExtraHrs, 8)) * 60 AS m_in_s
,
--get seconds:
DATEPART(SECOND, right(ExtraHrs, 8)) AS s
FROM @t
)
,CTE3
AS (
SELECT *
,c.h_in_s + c.m_in_s + c.s AddExtra
FROM cte c
)
,cte4
AS (
SELECT sum(AddExtra * multiply) mn
FROM cte3
)
,cte5
AS (
SELECT mn / 3600 hh
,(mn % 3600) / 60 mi
,(mn % 3600.0) % 60 ss
FROM cte4
)
SELECT CASE
WHEN hh < 0
THEN '-'
ELSE ''
END
,cast(hh AS VARCHAR) + ':' + cast(mi AS VARCHAR) + ':' + cast(ss AS VARCHAR)
FROM cte5