sql >> Databáze >  >> RDS >> Sqlserver

Vraťte na serveru SQL Server 2008 více než 24 hodin ve formátu hh:mm:ss

BTW existuje tolik technických nedostatků v procesu, stejně jako datový typ, který používáte. Skutečný problém je tady.

  1. Ve svém procesu můžete umístit podmínku data kde do prvního samotného CTE.
  2. Pokud je to možné, můžete v tabulce uložit další hodiny v sekundách. To znamená, že Extrahours je int nebo bigint. jako -1000 nebo 1000.varchar váš problém nikdy nevyřeší. Ušetří vám to spoustu konverzí, a proto rychle.
  3. Použití tolika sloupců ve skupině je samo o sobě špatný přístup. Speciálně použití sloupce varchar ve skupině podle. Měli byste použít klíčový sloupec ve skupině a poté se znovu spojit s tabulkou, abyste získali další sloupce v sadě výsledků.

s vašimi ukázkovými daty dostávám -29:-51:-30,0 místo -31:50:46. Udělejte to takto,

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. CHECK CONSTRAINT řetězce obsahovat pouze číslice. (Oracle SQL)

  2. Unix SSH bez hesla

  3. Jak znovu přiřadit sloupec AUTO_INCREMENT pro každý řádek v tabulce MySQL pomocí PHP

  4. Jak vygenerovat schéma z CSV pro kopii PostgreSQL