2016-06-16 2 views
0

Ich bin ziemlich neu in SQL. Ich mache eine Abfrage mit den Parametern, um alle Objekte herauszufiltern, die vor mehr als 6 Monaten versendet wurden, und (nach Überprüfung anderer Variablen), ob sie innerhalb der letzten 21 Tage versendet wurde. Der Code funktioniert, wenn ich die letzte Zeile halten kommentiert out (ich Ihnen weiter unten zeigen wird), aber wenn ich diese Zeile Kommentar-, gibt der Code mir den Fehler:SQLError mit Datumaddfunktion/Zeitfunktionen

Conversion failed when converting date and/or time from character string.

Ich habe Dinge versucht und die Erforschung, aber ich habe immer noch Probleme. Ihre Hilfe würde sehr geschätzt werden. Code unten:

where i.status IN ('CR','LB','OB') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (n.LastShpd IN ('0', '') 
    and (i.OnOrder IN ('0', '') 
    or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime2))) 
+0

Warum dann datetime2 zurück Haben Sie eine Datetime geworfen verkohlen? Vor allem zu einer viel kleineren Länge? – Pred

+2

Was ist der Datentyp von 'lastshpd'? –

+0

lastshpd ist ein Datum und Uhrzeit Datentyp –

Antwort

1

Das ist Ihre Abfrage:

where i.status IN ('CR','LB','OB') 
and i.FGCs > 0 
and i.LastShpd > CAST(CONVERT(CHAR(11),DATEADD(DAY,-180,GETDATE()),113) AS datetime) 
and (n.LastShpd IN ('0', '') -- I'm assuming error occurred in this point 
    and (i.OnOrder IN ('0', '') 
    or i.LastShpd < CAST(CONVERT(CHAR(11),DATEADD(DAY,-21,GETDATE()),113) AS datetime2))) 

try this:

FORMAT (n.LastShpd, 'd', 'en-US') in ('0','') 

Sobald Sie die FORMAT verwenden, SQL wandelt diese Werte zu varchar. Dann können Sie Ihre String-Bedingungen anwenden.

+0

'FORMAT' ist möglicherweise nicht verfügbar, abhängig davon, welche Version von SQL Server der Asker verwendet. (Es erfordert 2012+.) –

+0

Ups! Ich habe nicht darüber nachgedacht :( –

+0

Danke Marin Mohanadas. Mein Fehler trat an genau diesem Punkt auf, und dieser hilft mir, den Fehler zu finden. Ich schätze, dass Sie mir helfen. –

1

Angesichts der Besetzung von datetime oder datetime2 vor dem Vergleich mit i.LastShpd nehme ich den Datentyp von i.LastShpd Datum bezogen. Daher denke ich mit DATEDIFF statt DATEADD wird Ihre Anfrage vereinfachen ...

where i.status IN ('CR','LB','OB') 
and i.FGCs > 0 
and datediff(day, getdate(), i.LastShpd) < -180 
and (n.LastShpd IN ('0', '') 
    and (i.OnOrder IN ('0', '') 
    or datdiff(day, getdate(), i.LastShpd) < -21)) 
+0

Ich erhielt immer noch den gleichen Fehler –

+0

Ich entschuldige mich, Ihr Code war korrekt. Mein Fehler war tatsächlich mit dem n.LastShpd-Datentyp. Aber Ihr Code ist effizienter. Vielen Dank für Ihre Hilfe. –