2016-09-22 6 views
0

Ich schreibe eine Abfrage, um eins unserer Geräte abzufragen und dem Server unseren Solarwinds-Server zu melden. Es ist eine semi-erweiterte SQL-Abfrage, meine Ergebnisse als richtig kommen, aber ich bekomme diese Fehlermeldung:Zeichenfolge in Datetime-Fehler konvertieren

Msg 242, Ebene 16, Status 3, Zeile 1 Die Umwandlung eines nvarchar-Datentypen auf einen Typen Datetime-Daten resultierte in einem Wert außerhalb des Bereichs.

Ich bin neu in SQL, also bin ich mir nicht sicher, was ich zu lösen habe. Mein Codeblock ist unten:

SELECT tbl2.Load [Source], tbl3.Destination [Destination], tbl1.Status [Status], tbl4.Status [TimeStamp], 
CONVERT(datetime, SUBSTRING (tbl4.Status,5,3) + ' ' + SUBSTRING(tbl4.Status,9,2) + ' , ' + SUBSTRING(tbl4.Status,25,4) + ' ' + SUBSTRING(tbl4.Status,11,6)) AS DATE, 
DATEDIFF(HOUR,CONVERT(datetime, SUBSTRING (tbl4.status,5,3) + ' ' + SUBSTRING(tbl4.status,9,2) + ' , ' + SUBSTRING(tbl4.status,25,4) + ' ' + SUBSTRING(tbl4.status,11,6)) , GETDATE()) AS Timediff 
FROM Nodes n 

join (SELECT ca.nodeid, cs.Status [Load] 
    FROM CustomPollerStatus cs 
JOIN CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
    where cp.UniqueName='SnapMirrorSrc' 
    ) tbl2 on n.Nodeid = 
tbl2.NodeID 

join (select ca.nodeid, cs.Status [Destination] 
    FROM CustomPollerStatus cs 
JOIN CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
where cp.UniqueName='snapmirrordst' 
) tbl3 on n.Nodeid = tbl3.NodeID 

join (SELECT ca.nodeid, cs.Status 
    FROM CustomPollerStatus cs 
JOIN CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
    JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
    WHERE cp.UniqueName='SnapMirrorState' 
    ) tbl1 on n.Nodeid = tbl1.NodeID 

join (select ca.nodeid, cs.Status 
from CustomPollerStatus cs 
join CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN customPollerS cp on ca.CustomPollerID=cp.CustomPollerID 
WHERE cp.UniqueName='snapmirrorMirrorTimestamp' 
) tbl4 on n.NodeID = tbl4.NodeID 

where tbl1.Status like 'unk%' 

Hier meine Ergebnisse sind:

enter image description here

Allerdings bekomme ich diesen Fehler: Msg 242, Ebene 16, Status 3, Zeile 1 Die Umwandlung einer nvarchar Datentyp zu einem Datetime-Datentyp führte zu einem Wert außerhalb des Bereichs.

So sind meine Ergebnisse korrekt, aber ich bekomme diesen Fehler. Nicht sicher, was das Problem ist. Jede Hilfe würde freundlich geschätzt werden.

**** --- EDIT --- ****

Also änderte ich meinen Code ein wenig, aber jetzt in der Spalte Datum im 1900-01-01 bekommen 00: 00: 00.000

SELECT tbl2.Load [Source], tbl3.Destination [Destination], --tbl1.Status [Status], 
tbl4.Status [TimeStamp], 

CASE 
WHEN tbl4.status LIKE '[A-Z][A-Z][A-Z] %[1-9][1-9][1-9][1-9]' THEN 
CONVERT(datetime, SUBSTRING (tbl4.Status,5,3) + ' ' + SUBSTRING(tbl4.Status,9,2) + ' , ' + SUBSTRING(tbl4.Status,25,4) + ' ' + SUBSTRING(tbl4.Status,11,6)) 
ELSE '' END AS [DATE], 

CASE 
WHEN tbl4.status LIKE '[A-Z][A-Z][A-Z] %[1-9][1-9][1-9][1-9]' THEN 
CAST (DATEDIFF(HOUR,CONVERT(datetime, SUBSTRING (tbl4.status,5,3) + ' ' +  SUBSTRING(tbl4.status,9,2) + ' , ' + SUBSTRING(tbl4.status,25,4) + ' ' +  SUBSTRING(tbl4.status,11,6)) , GETDATE())AS bigint) 
ELSE '' END AS 'Time Since Last Snap' 
FROM Nodes n 

join (SELECT ca.nodeid, cs.Status [Load] 
    FROM CustomPollerStatus cs 
    JOIN CustomPollerAssignment ca ON  (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
    JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
    where cp.UniqueName='SnapMirrorSrc' 
    ) tbl2 on n.Nodeid = 
tbl2.NodeID 

join (select ca.nodeid, cs.Status [Destination] 
FROM CustomPollerStatus cs 
JOIN CustomPollerAssignment ca ON (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN CustomPollerS cp ON ca.CustomPollerID=cp.CustomPollerID 
where cp.UniqueName='snapmirrordst' 
) tbl3 on n.Nodeid = tbl3.NodeID 

join (select ca.nodeid, cs.Status 
from CustomPollerStatus cs 
join CustomPollerAssignment ca ON  (cs.CustomPollerAssignmentID=ca.CustomPollerAssignmentID) 
JOIN customPollerS cp on ca.CustomPollerID=cp.CustomPollerID 
WHERE cp.UniqueName='snapmirrorMirrorTimestamp' 
) tbl4 on n.NodeID = tbl4.NodeID 
+1

Versuchen Sie, eine SELECT tun, ohne die Konvertierung in DATETIME und sehen, ob irgendwelche Werte keine gültigen Daten sind. –

+0

Geben Sie anstelle des gesamten SELECT auch nur die Teile an, die das Problem verursachen (z. B. bezogen auf das fragliche Feld). – FDavidov

+0

Ihr Bild zeigt die Statusspalte mit dem Wert 'unbekannt'. Ist dies der tbl4.Status, den Sie in eine Datetime konvertieren möchten? – openshac

Antwort

0

Es sieht aus wie Sie einige ungültige Daten in der Spalte Tbl4.Status haben.

select tbl4.Status, * 
... 
where isdate(SUBSTRING (@status,5,3) 
     + ' ' + SUBSTRING(@status,9,2) 
     + ' , ' + SUBSTRING(@status,25,4) 
     + ' ' + SUBSTRING(@status,11,6)) = 0 

EDIT:

Um die ungültigen Daten vorübergehend die Auswahl ändern und wo Klausel Anweisung zu identifizieren

Ihre Case-Anweisung

CASE 
ELSE '' END AS [DATE] 

Wird immer zurückkehren ‚1900- 01-01 00: 00: 00.000 'wenn es in den ELSE Teil fällt. Dies zeigt ein ungültiges Datum an.

Mit dem bearbeiten Sie oben gemacht haben, einfach tbl4.Status zu Ihrem wählen hinzufügen, und fügen Sie dann die ungültigen Zeilen identifizieren, indem das Hinzufügen dieser zu Ihnen, wo Klausel:

[DATE] = '1900-01-01 00:00:00.000' 

Dies wird die falsche Statuszeilen identifizieren.

+0

Hallo, siehe meinen Kommentar oben –

0

es vielleicht ein Fehler für das Jahr Teil Abrufen: versuchen, mit SUBSTRING (tbl4.status, 2 , 4) statt SUBSTRING (tbl4.status, 25,4)