Ich habe eine große Tabelle mit 1 Million + Datensätze. Leider hat die Person, die die Tabelle erstellt hat, beschlossen, Daten in ein Feld varchar(50)
zu legen.SQL Server DateTime Konvertierung Fehler
Ich brauche einen einfachen Datumsvergleich zu tun -
datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31
Aber es scheitert an den convert()
:
Conversion failed when converting datetime from character string.
Offenbar ist es etwas in diesem Bereich ist es nicht mögen, und da sind so viele Aufzeichnungen, ich kann es nicht nur sagen, indem ich es ansehe. Wie kann ich das gesamte Datumsfeld ordnungsgemäß bereinigen, damit es nicht auf der convert()
fehlschlägt? Hier ist, was ich habe jetzt:
select count(*)
from MyTable
where
isdate(lastUpdate) > 0
and datediff(dd, convert(datetime, lastUpdate, 100), getDate()) < 31
Ich bin nicht besorgt über die Leistung in diesem Fall. Dies wird eine einmalige Abfrage sein. Das Ändern der Tabelle in ein Datetime-Feld ist keine Option.
Ich habe versucht, das dritte Argument hinzufügen, und es macht keinen Unterschied.
Das Problem ist höchstwahrscheinlich, wie die Daten gespeichert sind, gibt es nur zwei sichere Formate; ISO JJJJMMTT; ISO 8601 yyyy-mm-dd Thh: mm: ss: mmm (ohne Leerzeichen)
Wäre nicht das isdate()
Check darum kümmern?
Ich brauche keine 100% ige Genauigkeit. Ich möchte nur die meisten Aufzeichnungen der letzten 30 Tage bekommen.
select isdate('20080131') -- returns 1
select isdate('01312008') -- returns 0
Platz der Fall ist und im Inneren des ISDATE CONVERT() Funktion.
Vielen Dank! Das hat es getan.
Sie haben nicht erwähnt, für welche Formate die Datumsangaben im varchar-Feld stehen. Sind sie konsistent formatiert? Wenn man das Format kennt, hilft das bei der Lösung des Problems. – Kibbee