Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Geben Sie in SQL Server 2008 mehr als 24 Stunden im Format hh:mm:ss zurück

Übrigens gibt es so viele technische Fehler in der Verarbeitung sowie im Datentyp, den Sie verwenden. Ein echtes Problem ist hier.

  1. In Ihrem Prozess können Sie die Where-Datumsbedingung in den ersten CTE selbst einfügen.
  2. Wenn möglich, können Sie Extrahours an zweiter Stelle in der Tabelle speichern. Das bedeutet, Extrahours ist int oder bigint. wie -1000 oder 1000. varchar wird Ihr Problem niemals lösen. Es wird Ihnen daher schnell viel Konvertierung ersparen.
  3. Die Verwendung so vieler Spalten in Gruppierung nach ist selbst ein falscher Ansatz. Insbesondere die Verwendung der varchar-Spalte in Gruppierung nach. Sie sollten die Schlüsselspalte in der Gruppe verwenden, um dann erneut mit der Tabelle zu verbinden, um andere Spalten in der Ergebnismenge zu erhalten.

mit Ihren Beispieldaten erhalte ich -29:-51:-30,0 statt -31:50:46. Machen Sie es so,

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