BTW आपके द्वारा उपयोग किए जा रहे डेटा प्रकार के साथ-साथ खरीद में बहुत सारी तकनीकी खामियां हैं। असली समस्या यहाँ है।
- अपनी खरीद में आप पहले सीटीई में ही तारीख की स्थिति डाल सकते हैं।
- यदि संभव हो तो आप तालिका में अतिरिक्त घंटे को सेकंड में संग्रहीत कर सकते हैं। इसका मतलब है कि अतिरिक्त घंटे int या bigint.like -1000 या 1000.varchar कभी भी आपकी समस्या का समाधान नहीं करेंगे। यह आपको बहुत तेजी से रूपांतरण से बचाएगा।
- ग्रुप बाय में इतने सारे कॉलम का उपयोग करना अपने आप में गलत तरीका है। विशेष रूप से ग्रुप बाय में वर्कर कॉलम का उपयोग करना। आपको ग्रुप में की कॉलम का उपयोग करना चाहिए, फिर परिणाम में अन्य कॉलम प्राप्त करने के लिए टेबल के साथ फिर से जुड़ना चाहिए।
आपके नमूना डेटा के साथ मुझे -31:50:46 के बजाय -29:-51:-30.0 मिल रहा है। इसे इस तरह से करें,
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