sql >> Database >  >> RDS >> Sqlserver

Return groter dan 24 uur in uu:mm:ss formaat in SQL server 2008

Tussen haakjes, er zijn zoveel technische fouten in het proces en het gegevenstype dat u gebruikt. Het echte probleem is hier.

  1. In je proces kun je waar datumvoorwaarde in eerste CTE zelf zetten.
  2. Als het mogelijk is, kun je extra uur in de tweede tabel in de tabel opslaan. Dat betekent dat Extrahours int of bigint.like -1000 of 1000.varchar is, je probleem nooit zal oplossen. Het zal je veel conversie besparen en dus snel.
  3. Het gebruik van zoveel kolommen in group by is op zichzelf al een verkeerde benadering. Vooral het gebruik van varchar column in group by. Je zou key column in group by moeten gebruiken en dan opnieuw joinen met table om andere kolommen in de resultatenset te krijgen.

met uw voorbeeldgegevens krijg ik -29:-51:-30.0 in plaats van -31:50:46 .doe het op deze manier,

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


  1. Is er een manier om MySQL- en databasefouten in PHP op te vangen?

  2. Lob-segmenten (SYS_LOB) in orakel begrijpen?

  3. Dubbele vermeldingen in DB

  4. MySQL verkeerde resultaten met GROUP BY en ORDER BY