2017-06-29 4 views
0

Ich habe eine Spalte in meinem Datensatz namens Duration, die die Länge der Zeit das Ereignis aufgetreten ist berechnet. Das aktuelle Format ist in einem ungeraden nvarchar(2000) Format, die Zellen wie folgt erzeugt:SQL-Formatierung von Nvarchar Länge der Zeit

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

(Anzahl der Stunden, die Anzahl der Minuten, die Anzahl der Sekunden)

Wie dies als eine Gesamtzahl von Sekunden formatiert werden könnte ?

Einige Ideen sollten CHARINDEX oder ein Teilstring verwenden, aber ich konnte es nicht zum Funktionieren bringen.

Vielen Dank für Ihre Hilfe!

Edit: Ich bin mit SQL Server Management Studio 17

+2

die SQL-Datenbank? – maSTAShuFu

+0

Ich benutze SQL Server Management Studio 17 – Brady

+0

Das riecht wie Hausaufgaben. Hast du schon etwas probiert? Übrigens ist das Speichern von Zeit in diesem Format eine rundum wirklich schlechte Idee. –

Antwort

1

Nur Ihr Problem
Below zu lösen ist, wie ich Ihr Format sezierte und Grundrechen anwenden, um die Sekunden zu erhalten.

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 hier:

Rextester

+0

Ihre Abfrage schlägt für bestimmte Testfälle fehl, [siehe hier] (http://rextester.com/VIKK25965). –

+0

was meinst du tim? Ich weiß für eine Tatsache, dass dies nicht das Optimum ist – maSTAShuFu

+0

Just beheben Sie die Demo und Sie sollten in Ordnung sein. –

Verwandte Themen