Konvertieren von VARCHAR in SMALLDATETIME als Teil der UPDATE-Anweisung
Ich bin der Durchführung einer bulk-import von Daten über CSV-Dateien. In den CSV-Dateien, mein 'Date' - Spalte enthält ein Datum im format 'YYYYDDMMHHMM' (z.B. 200603010929).
Wie es steht, wenn ich die Option 'smalldatetime' beim erstellen der Tabelle, der Daten-import wird mit diesem Fehler fehlschlagen:
Massenladen von Daten Fehler bei der Konvertierung (Typenkonflikt oder ungültiges Zeichen
für die angegebene codepage) für Zeile 2, Spalte 2 (Datum).
Wie ich es verstehe, für Sie zu arbeiten muss das Datum ein bestimmtes format zu arbeiten.
Daher, eine Idee, die ich habe ist, importieren Sie die Datumswerte in einem Feld vom Typ VARCHAR, dann, wenn der import abgeschlossen ist möchte ich ein UPDATE durchführen für jede Zeile konvertieren des Datums in einen smalldatetime. Dies würde die Verlängerung der import-Prozess, aber ich denke, es wäre viel einfacher und viel schneller als der Versuch zu tun, ein suchen und ersetzen auf die CSV-Daten (es ist eine enorme Datenmenge).
So, meine Frage ist:
1) Ist das möglich?
2) Wie kann ich das umsetzen?
Dies ist, was ich habe, so weit:
UPDATE NYSE
SET [date]=CONVERT(smalldatetime, [date])
Dieser schlägt fehl, da der text nicht im richtigen format. Ist es möglich, das format der Zeichenfolge innerhalb der CONVERT-Funktion, oder gibt es eine andere Möglichkeit?
Ich Schätze alle Kommentare. Danke.
Sind Sie sicher, dass die YYYYDDMM ohne Zeit ist eigentlich korrekt importiert? Diese sind vermutlich durch das vertauschen der D-und M-Werte...
So brauchen Sie sich nicht darum, ob die Daten korrekt oder nicht? So wird der Benutzer eingetragen, der 1. März, sondern Sie interpretieren es so, 3. Januar, und das ist ok? Ich bin sehr verwirrt.
Wo sehen Sie YYYY-DD-MM-auf dieser Seite?
Ich würde vorschlagen, sagen, wer liefert diese Daten, um Sie zu stoppen, die dumm über Sie, und liefern ein gültiges format. Oder pre-Prozess die Dateien mit einem sehr einfachen Kommandozeilen-Programm, bevor Sie hinzufügen der SQL Server-Komplexität.
InformationsquelleAutor Ciaran Gallagher | 2013-10-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es ist, in der Tat, JJJJMMTT, dann ist es etwas einfacher:
Es ist im Grunde einfach auseinander ziehen die Stücke der ungültige Zeichenfolge zu bilden, eine gültige Zeichenfolge. Beginnend in der zweiten Zeile und arbeiten Sie heraus, es ist unter die ersten 4 Zeichen (2006), dann die 7. und 8. Zeichen (01), dann die 5. und 6. Zeichen (01). Dies bildet eine gültige und eindeutige Datum in YYYYMMDD format. Dann auf die 3. Zeile fügen wir ein Leerzeichen und injizieren einen Doppelpunkt in die letzten 4 Zeichen (0929), so dass es eine gültige Zeit (09:29) und bilden eine gesamte Zeichenfolge von 20060103 09:29. Diesen string können wir umwandeln in einen smalldatetime -, aber um zu speichern, den string so, wir müssen auch einen Stil.
Ich lief die Update-Anweisung, wie Sie zur Verfügung gestellt, aber ich bekam einen Fehler "Zeichenfolgen-oder Binärdaten würden abgeschnitten". Meine varchar hat eine 15-Zeichen-limit auf derzeit. Ich habe die CHAR(16) argument CHAR(15), mit dieser er warf die Fehlermeldung "bei Der Konvertierung eines varchar-Datentyps in einen smalldatetime-Datentyp führte zu einer out-of-range-Wert.". Dieses mal lief es für länger. Würde ich müssen, bis das limit auf meiner varchar, bevor Sie dies ausführen?
Ja, Sie werden bemerken, dass ich verwendet, varchar(20) für die Polsterung. Der Fehler, den du jetzt bekommen, weil Sie mindestens ein Datum, das NICHT in dem format, das Sie beschreiben. Versuchen
SELECT ... FROM dbo.table WHERE ISDATE(LEFT([date],4) + SUBSTRING([date],7,2) + SUBSTRING([date],5,2) + ' ' + STUFF(RIGHT([date],4),3,0,':')) = 0;
Ich glaube, Sie verpasste den Teil, wo ich sagte, Sie haben einige ungültige Daten, dass meine Antwort nicht lösen können, und Sie müssen die WÄHLEN, die ich gepostet in einem Kommentar, um es zu identifizieren und zu beheben...
InformationsquelleAutor Aaron Bertrand