Konvertieren von DateTime mit Dezimalzeit länger als 3 Ziffern?

1465
Ƭᴇcʜιᴇ007

Ich versuche, einige Daten aus CSV in MS SQL 2008 Server zu importieren. Ich verwende das Invoke-SQL von PowerShell und ein SQL-Skript, das verwendet wirdBULK INSERT .

CSV-Felder werden als VarChars importiert und ich versuche, die Datentypen anzugeben.

In den in der CSV bereitgestellten Daten (die ich nicht kontrollieren kann) haben einige datetime-Felder ein Datum und eine Uhrzeit in diesem Format:

2012-03-15 15:10:08.920000000

Normalerweise benutze ich einfach ALTER und lasse es von SQL konvertieren, und normalerweise funktioniert das ... zB:

ALTER TABLE [dbo].[ImportData] ALTER COLUMN [PlanSetupDate] datetime null;

Wenn es jedoch eines der DateTimes wie oben trifft, schlägt die Fehlermeldung fehl:

Die Konvertierung ist beim Konvertieren von Datum und / oder Uhrzeit aus der Zeichenfolge fehlgeschlagen.

Als nächstes habe ich SQL's Convert ausprobiert:

Select Convert(datetime, '2012-03-15 15:10:08.920000000')

Ich erhalte jedoch dieselbe Fehlermeldung wie bei der Verwendung von ALTER.

Wenn ich die zusätzlichen Dezimalstellen ausschneide (drei oder weniger belassen), funktioniert die Konvertierung wie erwartet, zB:

2012-03-15 15:10:08.920

Ich kann vor dem Konvertieren nicht einfach die letzten X-Zeichen aus dem Feld abschneiden, da die meisten anderen datetime-Zeichen in der Spalte ein eher traditionelles Format haben 2010-01-05 00:00:00.

Während ich es behalten möchte, ist der Zeitanteil wirklich nicht so wichtig, definitiv nichts nach der Dezimalstelle. Wenn also die Konvertierungslösung die Dezimalstelle abschneiden muss, ist das in Ordnung. :)

Ich könnte die CSV-Datei immer vor dem Importieren in SQL über PowerShell oder ähnliches ändern. Ich würde es jedoch vorziehen, alle meine Daten in SQL zu verarbeiten, wenn möglich.

Gibt es eine Möglichkeit, dieses problematische datetime-Format mithilfe einer SQL-Abfrage zu konvertieren?

3
Haben Sie versucht, DATETIME2 zu verwenden? Die Sekundengenauigkeit geht standardmäßig auf 7 Stellen. BillP3rd vor 8 Jahren 3
Haben Sie überlegt, "datetime2" anstelle von "datetime" zu verwenden? Datetime enthält nur 3 Ziffern nach Sekunden, Datetime2 bis zu 7 Ziffern. Scott Chamberlain vor 8 Jahren 2
Hmmm datetime2 ist für mich neu. Vielleicht ist das doch die beste Wette. Ok, ich habe es überprüft und es funktioniert in meinem Konvertierungsbeispiel - schön! Ich bin im Moment knapp, daher kann ich es in dieser Sekunde nicht mit ALTER testen (was meine Vorliebe für das ist, was ich mache), aber wenn es funktioniert (was ich völlig erwartet habe), freue ich mich akzeptiere das als Antwort, wenn jemand es offiziell aufschreiben will. :) Ƭᴇcʜιᴇ007 vor 8 Jahren 0
PS: Dies war meine erste SU-Frage. :) Ƭᴇcʜιᴇ007 vor 8 Jahren 2

1 Antwort auf die Frage

2
BillP3rd

DATETIME2ist der SQL-Datentyp, nach dem Sie suchen. Es dauert Sekunden bis zu 7 Dezimalstellen. TechNet bietet umfassende Informationen, wobei Beispiele die verschiedenen Typen hier vergleichen .

Im Folgenden erhalten Sie die Grundlagen für alle anwendbaren Typen:

SELECT  CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time'  ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'  ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS 'smalldatetime'  ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'  ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 'datetime2' ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 'datetimeoffset'; 

Produziert die Ergebnisse:

Data type Output time 12:35:29. 1234567 date 2007-05-08 smalldatetime 2007-05-08 12:35:00 datetime 2007-05-08 12:35:29.123 datetime2 2007-05-08 12:35:29.1234567 datetimeoffset 2007-05-08 12:35:29.1234567 +12:15 

Die obigen Abfragen und Ergebnisse stammen direkt von der oben genannten TechNet-Seite.

NB: Ich glaube, das DATETIME2erschien erstmals in SQL 2008.

warum ist das in Superuser? Rafael vor 8 Jahren 0