2017-07-17 8 views
0

J'ai besoin de convertir une valeur en millisecondes, 85605304.3587 à une valeur comme 0d 18h ​​21m. Aucune idée sur la façon de démarrer cela, y at-il quelque chose de similaire à un TimeSpan dans SQL comme il y a en C#?Conversion de millisecondes SQL en jours, heures, minutes

+3

Quels [DBMS] (https://fr.wikipedia.org/wiki/DBMS) utilisez-vous? Postgres? Oracle? Le type de données en SQL standard (auquel se réfère la balise 'sql') serait' intervalle' –

+0

SQL 2017 est ce que j'utilise –

+1

Il n'y a pas de standard nommé "SQL 2017" mais je suppose que vous vouliez dire "SQL ** Serveur ** 2017 " –

Répondre

3

Vous pouvez effectuer le calcul explicitement. Je pense qu'il est:

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

Remarque: Certaines bases de données utilisent mod au lieu de %.

+0

La première parenthèse de la troisième ligne rend ce document irrécupérable. – KtX2SkD

+0

Oui mais ça marche une fois enlevé, merci :) –

0

Dans MS SQL Server, vous pouvez utiliser le code suivant:

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 
1

En utilisant date & time functions native, peut-être:

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 ne couvre que 3 chiffres au-delà de secondes, tandis que datetime2 maintiendra 7 chiffres. Peut-être que d'autres moyens qui donnent des objets de type date existent, je ne le saurais pas.