2009-01-22 13 views
6

Ich frage mich, was ist die beste Möglichkeit, ein DateTime-Objekt zu Ihrem SQL-Server zu analysieren.Die beste Methode zum Analysieren von DateTime zu SQL Server

Wo Sie die SQL in Code generieren.

Ich habe immer etwas wie DateTime.Now.TolongDateString() verwendet und hatte gute Ergebnisse, abgesehen von heute, wo ich einen Fehler bekam, und es ließ mich nachdenken.

System.Data.SqlClient.SqlException: Conversion failed when converting datetime from character string 

Was ist also jeder Gedanken und recomendations für eine Art und Weise, die alle SQL-Server arbeiten acrss wird, egal was Setup dort ..

Vielleicht so etwas wie DateTime.Now.ToString("yyyy/MM/dd")

+0

Ich habe jetzt verwendet .ToString ("JJJJ-MM-TT HH: mm: ss: fff"), die scheint gut zu funktionieren – TheAlbear

Antwort

14

gibt es nur 2 sichere Formate

ISO und ISO8601

ISO = yymmdd

ISO8601 = yyyy-mm-dd Thh: mm: ss: mmm (keine Leerzeichen) (beachten Sie die T)

Siehe auch hier: Setting a standard DateFormat for SQL Server

+0

fehlschlagen Ich habe Angst, das ist nicht wahr in der Datenbank selbst die Zeichenfolge '1997-12-09' kann je nach Datenbankeinstellungen entweder am 9. Dezember oder am 12. September behandelt werden. So können Sie nie garantieren, wie die Zeichenfolge, die Sie an die DB übergeben, behandelt wird, wenn Sie nicht die Formatierung angeben. – kristof

+3

Kristof, wenn Sie Bindestriche im Format verwenden möchten, müssen Sie das T verwenden. Wenn Sie die Bindestriche entfernen, wird es nie falsch interpretiert. Anstelle von '1997-12-09' '19971209' verwenden. –

+0

Danke Mastros - das war mir nicht bewusst, ich denke, du kannst jeden Tag etwas lernen :) – kristof

1

Formatierung DateTime.ToString mit (“ JJJJ-MM-TT HH: MM: SS: FFF ") wird das MS SQL Server Datum/Uhrzeit-Format übereinstimmen. (Ich glaube, SQL Server ist ziemlich "intelligent" über das Erkennen etwas anders aussehende Formate, zB mit Schrägstrichen, aber ich habe dieses erfolgreich selbst verwendet.)

EDIT: Wie von Kommentator bemerkt, wird dies wahrscheinlich ruiniert werden einige Ländereinstellungen.

+0

dieser wird für ydm Locale –

3

dieses nicht immer fehlschlagen: DateTime.Now.ToString ("yyyyMMdd HH: mm: ss.fff")

10

Warum die Abfrage nicht parametrisieren und den Datetime-Wert als SQL-Datetime-Eingang param geben ?

beispiels INSERT INTO SomeTable (Blah, MyDateTime) VALUES (1, @MyDateTime)

Dann können Sie wirklich sicher sein. Selbst wenn Sie das SQL generieren, sollten Sie in der Lage sein, dies speziell zu handhaben?

3

Achten Sie darauf, wenn das Datum DateTime.Min ist, da SQL Server 1700s für den Beginn der Zeit selbst verwendet. Ich würde ein ISO-Datetime-Format verwenden: DateTime.ToString ("s"), aber das habe ich bei nicht-westlichen Installationen nicht ausprobiert.

z.B.

DateTime.Now.ToString("c") 

ist

insert into testtable values ('2009-01-22T15:08:13') 
5

Sie wirklich, dass parametrisierte Abfragen verwenden soll und Ihre Datetime Objekt als SQL Datetime Parameter übergeben.

Wenn Sie die Datetime zu String analysieren Sie mit den Lokalisierungseinstellungen sowohl auf dem Anwendungsserver wie auf dem Datenbank-Server zu tun haben. Dies kann zu einigen unangenehmen Überraschungen führen, wie zum Beispiel das Datum behandeln, wie es auf einer Seite im US-Format war, und z.B. UK auf einem anderen.Der String 9/12/2000 kann entweder der 12. September oder der 9. Dezember sein. Halten Sie also die Daten im DateTime Objekt/Typ beim Austausch zwischen Anwendung und Datenbank.

Das einzige Mal, wenn Sie Datetime zu String analysieren würde wäre, wenn Daten (GUI) angezeigt wird. Aber dann sollten Sie sicherstellen, dass die richtige Lokalisierungseinstellung beim Parsen verwendet wird, um sie in dem Format anzuzeigen, das der Benutzer erwartet. Das gleiche Prinzip gilt für andere Datentypen wie float zum Beispiel. Die Zeichenfolgendarstellung davon hängt vom Gebietsschema ab und ich nehme an, dass Sie nicht float zu String beim Übermitteln es an die Datenbank also warum mit der DateTime analysieren?

10

fand ich dieses spezielle Format benötigt wurde:

DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fff") 

Hinweis Gehäuse und Fehlen von Räumen. Dies ist der universelle Weg nach .

Verwandte Themen