BTW ada begitu banyak kelemahan teknis dalam proc serta tipe data yang Anda gunakan. Masalah Sebenarnya ada di sini.
- Dalam proc Anda, Anda dapat menempatkan kondisi tanggal di CTE pertama itu sendiri.
- Jika memungkinkan, Anda dapat menyimpan jam ekstra dalam hitungan detik dalam tabel. Artinya, Extrahours adalah int atau bigint.like -1000 atau 1000.varchar tidak akan menyelesaikan masalah Anda. Ini akan menyelamatkan Anda dari banyak konversi dengan cepat.
- Menggunakan begitu banyak kolom dalam grup dengan sendirinya merupakan pendekatan yang salah. Khususnya menggunakan kolom varchar di grup by. Anda harus menggunakan kolom kunci dalam grup kemudian bergabung lagi dengan tabel untuk mendapatkan kolom lain di hasil.
dengan data sampel Anda, saya mendapatkan -29:-51:-30.0 bukannya -31:50:46 .lakukan dengan cara ini,
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