it-swarm.com.de

SQL Konvertieren Sie Millisekunden in Tage, Stunden, Minuten

Ich muss einen Millisekundenwert, 85605304.3587, in einen Wert wie 0d 18h ​​21m konvertieren. Keine Ahnung, wie das zu beginnen ist. Gibt es etwas, das einem TimeSpan in SQL ähnelt, wie in C #?

4
sd_dracula

Sie können die Berechnung explizit durchführen. Ich halte es für:

select floor(msvalue / (1000 * 60 * 60 * 24)) as days,
       floor(msvalue / (1000 * 60 * 60)) % 24 as hours,
       floor(msvalue / (1000 * 60)) % 60 as minutes

Hinweis: Einige Datenbanken verwenden mod anstelle von %.

7
Gordon Linoff

Verwendung von nativen Datums- und Zeitfunktionen , möglicherweise:

SELECT
    AsDateTime = DATEADD(MILLISECOND, 85605304, 0)
  , AsDateTime2 = DATEADD(NANOSECOND, 7 * 100, DATEADD(MICROSECOND, 358, DATEADD(MILLISECOND, 85605304, CONVERT(datetime2, CONVERT(datetime, 0)))))
-- Incorrect datetime2 approach I initially did, has some precision loss, probably due to datetime's millisecond issue with 0's, 3's, and 7.'s
--SELECT DontDoThis = DATEADD(NANOSECOND, 7 * 100, DATEADD(MICROSECOND, 358, CONVERT(datetime2, DATEADD(MILLISECOND, 85605304, 0))))

datetime umfasst nur 3 Ziffern nach Sekunden, während datetime2 7 Ziffern enthält. Vielleicht gibt es andere Möglichkeiten, die datumsähnliche Objekte geben, würde ich nicht wissen.

1
KtX2SkD

In MS SQL SERVER können Sie nächsten Code verwenden:

with cte as (
    select cast(85605304.3587 as int) / 1000 / 60 as [min]
), cte2 as (
    select 
        cast([min] % 60 as varchar(max)) as minutes,
        cast(([min] / 60) % 24 as varchar(max)) as hours,
        cast([min] / (60 * 24) as varchar(max)) as days
    from cte
)
select concat(days, 'd ', hours, 'h ', minutes, 'm') as tm
from cte2