2017-06-29 4 views
0

J'ai une colonne dans mon ensemble de données appelée Duration qui calcule la durée de l'événement. Le format actuel est dans un format nvarchar(2000) étrange qui produit des cellules comme ceci:Formatage SQL à partir de la durée nvarchar

7H35M49S (as in 7 hours, 35 minutes, 49 seconds) 
32M10S 
2H23S 

(nombre d'heures, le nombre de minutes, le nombre de secondes)

Comment cela pourrait-il être formaté comme un nombre total de secondes ?

Certaines idées devaient utiliser CHARINDEX ou une sous-chaîne, mais je ne pouvais pas le faire fonctionner.

Merci pour votre aide!

Edit: J'utilise SQL Server Management Studio 17

+2

qui base de données SQL? – maSTAShuFu

+0

J'utilise SQL Server Management Studio 17 – Brady

+0

Cela sent le devoir. Avez-vous déjà essayé quelque chose? En passant, stocker du temps dans ce format est une très mauvaise idée. –

Répondre

1

Seulement pour résoudre votre problème
Voici comment je disséqué votre format et appliquer l'arithmétique de base pour obtenir les secondes.

declare @mytime varchar(100) = '7H35M49S' 

select 
    isnull(NULLIF(left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime)-1)),''),0) -- to get Hours 
,isnull(NULLIF(replace(left(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''),charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))),'M',''),''),0) -- to get M 
,isnull(nullif(
    left(replace(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), left(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), IIF(charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))=0,0,charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),'')))),'') 
    ,iif(charindex('S', 
    replace(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), left(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), IIF(charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))=0,0,charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),'')))),'') 
    ) = 0,0, 
    charindex('S', 
    replace(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), left(replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''), IIF(charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),''))=0,0,charindex('M',replace(@mytime,left(@mytime, IIF(charindex('H',@mytime)=0,0,charindex('H',@mytime))),'')))),'') 
    )-1) 
    ) 
    ,'') 
    ,0) -- to get S 

Demo ici:

Rextester

+0

Votre requête échoue pour certains cas de test, [voir ici] (http://rextester.com/VIKK25965). –

+0

que voulez-vous dire tim? Je sais pour un fait que ce n'est pas l'optimum – maSTAShuFu

+0

Juste réparer la démo et vous devriez aller bien. –