2016-10-17 9 views
1

Ich habe zwei Felder in meiner Tabelle, Cycle und Idle, beide sind Nvarchar (50) und beide enthalten Zeit. Ich versuche, eine Summe für jedes Feld basierend auf einer bestimmten Programmnummer mithilfe von TSQL zu erhalten. Unten ist ein kleines Beispiel für die Daten.Cast funktioniert auf einem Feld, aber nicht

Id  ProgramNo   Cycle  Idle 
209702 3998_BOTH_OPPS.MPF 00:02:41 00:00:25 
209703 472_7580_OPP1.MPF 00:02:08 00:01:44 
209704 3998_BOTH_OPPS.MPF 00:00:27 00:00:11 
209705 3998_BOTH_OPPS.MPF 00:00:00 00:00:00 
209706 3998_BOTH_OPPS.MPF 00:00:01 00:01:40 
209707 9491_OPP1.MPF  00:00:00 00:00:00 
209708 9491_OPP1.MPF  00:00:01 00:00:04 
209709 9491_OPP1.MPF  00:01:05 00:00:19 

So zum Beispiel die Gesamtzykluszeit und Standby-Zeit für ProgramNo 3998_BOTH_OPPS.MPF erhalten und 9491_OPP1.MPF

Diese meine Frage ist ...

SELECT 
    ProgramNo, 
    cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(Cycle AS DATETIME))), 0) AS TIME) AS CycleTime, 
    cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(Idle AS DATETIME))), 0) AS TIME) AS IdleTime 
FROM Cycle 
GROUP BY ProgramNo 

Es funktioniert gut für CycleTime, aber ich bekomme einen Fehler für IdleTime:

"Konvertierung fehlgeschlagen beim Konvertieren von Datum und/oder Uhrzeit aus Zeichenkette . "

Irgendwelche Vorschläge? Vielen Dank im Voraus.

+1

es bedeutet, dass Sie einige schlechte Daten in den Datensätzen in diesem Feld haben. Etwas, das nicht konvertiert werden kann. – HLGEM

Antwort

1

Sie müssen Werte finden, die nicht mit dem Format HH: MM: SS übereinstimmen.

Hier ist eine stark vereinfachte Methode:

select idle_time 
from cycle 
where idle_time not like '[0-9][0-9]:[0-9][0-9]:[0-9][0-9]' 

Wenn das nicht, dann an den Komponenten aussehen funktioniert:

where (idle_time like '[0-9][0-9]:[0-9][0-9]:[0-9][0-9]' and 
     (not (left(idle_time, 2) between '00' and '23') or 
     not substring(idle_time, 4, 2) between '00' and '59') or 
     not right(idle_time, 2) between '00' and '59') 
     ) 

SQL Server 2012+ dies viel einfacher, mit try_convert() macht.

+0

2.03: 02: 07 3.18: 15: 05 3.21: 06: 53 3.19: 40: 03 2.09: 20: 53 – volleygirl029

+0

So scheint es, dass ich eine Nummer vor der Stunde habe, gefolgt von einem Punkt. Ich fügte den obigen Kommentar versehentlich hinzu, bevor ich eine Chance hatte, ihn zu betrachten. Gibt es einen besseren Vorschlag, wie ich diese Felder zusammenrechnen könnte? Ich fühle mich wie ich alles versucht habe. – volleygirl029

+0

@ volleygirl029. . . Bitte stellen Sie eine andere Frage mit entsprechenden Beispieldaten (einschließlich der Felder mit den Leerzeichen) und den gewünschten Ergebnissen. –

0

Basierend auf Ihren Kommentar oben, können Sie Ihre Daten wie so beheben können:

cast(dateadd(MILLISECOND, sum(datediff(MILLISECOND, 0, cast(right(Idle,8) AS DATETIME))), 0) AS TIME) as IdleTime 

Wir sind nur auf der Suche nach rechts höchstens 8 Zeichen ... so, wenn es nicht ein #. vor Ihrer Zeit wird es noch funktionieren

select right('3.18:15:05',8) 
select right('18:15:05',8) 
Verwandte Themen