Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zwróć więcej niż 24 godziny w formacie gg:mm:ss w serwerze SQL 2008

BTW jest tak wiele technicznych błędów w proc, a także typie danych, których używasz. Prawdziwy problem jest tutaj.

  1. W swoim proc możesz umieścić warunek daty w samym pierwszym CTE.
  2. Jeśli to możliwe, możesz zapisać dodatkowe godziny jako drugie w tabeli. Oznacza to, że Extrahours to int lub bigint.jak -1000 lub 1000.varchar nigdy nie rozwiąże Twojego problemu. Pozwoli to zaoszczędzić wiele konwersji, a tym samym szybko.
  3. Używanie tylu kolumn w grupie według jest samo w sobie złym podejściem.szczególnie używanie kolumny varchar w grupie według.Należy użyć kolumny klucza w grupie, a następnie ponownie połączyć się z tabelą, aby uzyskać inne kolumny w zestawie wyników.

z twoimi przykładowymi danymi otrzymuję -29:-51:-30.0 zamiast -31:50:46 .zrób to w ten sposób,

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwalacz SQL Server wstawia wartości z nowego wiersza do innej tabeli

  2. Jaka jest maksymalna liczba wierszy, które może przechowywać pojedyncza tabela programu SQL Server?

  3. Zapytanie SQL — łączenie wyników w jeden ciąg

  4. Dlaczego [data] + ([godzina]-[przesunięcie]) nie jest deterministyczny w programie SQL Server 2008?

  5. Wyszukaj i zamień część ciągu w bazie danych