Ich möchte einen String wie folgt konvertieren:
'10/15/2008 10:06:32 PM'
in den entsprechenden DATETIME-Wert in SQL Server.
In Oracle würde ich Folgendes sagen:
TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')
Diese Frage impliziert, dass ich die Zeichenfolge in eines der Standardformate analysieren und dann mit einem dieser Codes konvertieren muss. Das scheint für eine so weltliche Operation lächerlich. Gibt es einen einfacheren Weg?
sql-server
tsql
datetime
sql-server-2005
string-to-datetime
JosephStyons
quelle
quelle
Antworten:
SQL Server (2005, 2000, 7.0) bietet keine flexible oder gar nicht flexible Möglichkeit, eine beliebig strukturierte Datumszeit im Zeichenfolgenformat in den Datentyp Datumszeit zu konvertieren.
Mit "willkürlich" meine ich "eine Form, die die Person, die sie geschrieben hat, obwohl vielleicht nicht Sie oder ich oder jemand auf der anderen Seite des Planeten, als intuitiv und völlig offensichtlich betrachten würde." Ehrlich gesagt bin ich mir nicht sicher, ob es einen solchen Algorithmus gibt.
quelle
9/6/12
, den 6. September 2012, den 9. Juni 2012, den 6. Dezember 2009 oder etwas anderes meinte?Versuche dies
und
Weitere Informationen finden Sie unter CAST und CONVERT (Transact-SQL) .
quelle
Cast('2011-07-07' as datetime)
auch funktioniert und die Unklarheit über die Reihenfolge von Monat und Tag beseitigt.SET DATEFORMAT dmy
vor Ihrer Anfrage verwendet werdenFühren Sie dies durch Ihren Abfrageprozessor. Es formatiert Daten und / oder Zeiten wie diese und eine davon sollte Ihnen das geben, wonach Sie suchen. Es wird nicht schwer sein, sich anzupassen:
quelle
In SQL Server Denali können Sie etwas tun, das sich dem nähert, was Sie suchen. Sie können jedoch immer noch nicht einfach eine beliebig definierte verrückte Datumszeichenfolge übergeben und erwarten, dass SQL Server diese berücksichtigt. Hier ist ein Beispiel mit etwas, das Sie in Ihrer eigenen Antwort gepostet haben. Die FORMAT () -Funktion kann auch Gebietsschemas als optionales Argument akzeptieren. Sie basiert auf dem .NET-Format, sodass die meisten, wenn nicht alle Token-Formate vorhanden sind, die Sie erwarten.
Ich empfehle Ihnen dringend, mehr Kontrolle zu übernehmen und Ihre Datumseingaben zu bereinigen. Die Tage, an denen Personen Datumsangaben in einem beliebigen Freetext-Formularfeld in einem beliebigen Format eingeben konnten, sollten inzwischen weit hinter uns liegen. Wenn jemand am 09.08.2011 eintritt, ist das der 9. August oder der 8. September? Wenn Sie sie dazu bringen, ein Datum in einem Kalendersteuerelement auszuwählen, kann die App das Format steuern. Unabhängig davon, wie sehr Sie versuchen, das Verhalten Ihrer Benutzer vorherzusagen, werden sie immer einen dümmeren Weg finden, um ein Datum einzugeben, das Sie nicht geplant haben.
Bis Denali denke ich jedoch, dass @Ovidiu bisher die besten Ratschläge hat ... dies kann durch die Implementierung Ihrer eigenen CLR-Funktion ziemlich trivial gemacht werden. Dann können Sie einen Fall / Schalter für so viele verrückte Nicht-Standardformate schreiben, wie Sie möchten.
UPDATE für @dhergert :
Ergebnisse:
Sie müssen zuerst noch diese anderen wichtigen Informationen haben. Sie können natives T-SQL nicht verwenden, um festzustellen, ob der
6/9/2012
9. Juni oder der 6. September ist.quelle
Für dieses Problem ist die beste Lösung, die ich verwende, eine CLR-Funktion in SQL Server 2005 zu haben, die eine der Funktionen DateTime.Parse oder ParseExact verwendet, um den DateTime-Wert mit einem angegebenen Format zurückzugeben.
quelle
Benutze das:
Die Umrechnungscodes finden Sie in der Tabelle in der offiziellen Dokumentation .
quelle
Warum nicht versuchen
Datumsformate finden Sie unter SQL Server Helper> SQL Server-Datumsformate
quelle
select convert(date,'10/15/2011 00:00:00',101)
. Weitere Details zum Format und warum 101 finden Sie unter docs.microsoft.com/en-us/sql/t-sql/functions/…Ich habe eine Minute gebraucht, um das herauszufinden, also hier für den Fall, dass es jemandem helfen könnte:
In SQL Server 2012 und besser können Sie diese Funktion verwenden:
So habe ich die Teile des Datums extrahiert, die in diese Funktion eingefügt werden sollen:
quelle
Diese Seite enthält einige Verweise auf alle angegebenen Datums- / Uhrzeitkonvertierungen, die für die Funktion CONVERT verfügbar sind. Wenn Ihre Werte nicht in eines der akzeptablen Muster fallen, ist es meiner Meinung nach am besten, die ParseExact-Route zu wählen.
quelle
Persönlich, wenn Sie mit willkürlichen oder völlig unkonventionellen Formaten zu tun haben, vorausgesetzt, Sie wissen, was sie im Voraus sind oder werden, verwenden Sie einfach regexp, um die Abschnitte des gewünschten Datums abzurufen und eine gültige Datums- / Datums- / Uhrzeitkomponente zu bilden.
quelle
Ich weiß, dass dies ein böser alter Beitrag mit vielen Antworten ist, aber viele Leute denken, dass sie entweder Dinge auseinander brechen und wieder zusammensetzen MÜSSEN oder darauf bestehen, dass es keine Möglichkeit gibt, die vom OP-Original angeforderte Konvertierung implizit durchzuführen .
Um andere mit derselben Frage zu überprüfen und hoffentlich eine einfache Antwort zu geben, fragte das OP, wie man '10 / 15/2008 10:06:32 PM 'in eine DATETIME konvertiert. Jetzt hat SQL Server einige Sprachabhängigkeiten für zeitliche Konvertierungen. Wenn die Sprache jedoch Englisch oder ähnliches ist, wird dies zu einem einfachen Problem. Führen Sie einfach die Konvertierung durch und sorgen Sie sich nicht um das Format. Zum Beispiel (und Sie können CONVERT oder CAST verwenden) ...
... und das ergibt die folgenden Antworten, die beide richtig sind.
Wie sie in den Fernsehwerbespots sagen: "Aber warten Sie! Bestellen Sie noch nicht! Ohne zusätzliche Kosten kann es VIEL mehr!"
Lassen Sie uns die wahre Kraft zeitlicher Konvertierungen mit DATETIME sehen und den als DATETIME2 bekannten Fehler teilweise untersuchen. Schauen Sie sich die verrückten Formate an, die DATETIME automatisch verarbeiten kann und die DATETIME2 nicht. Führen Sie den folgenden Code aus und sehen Sie ...
Also, ja ... SQL Server verfügt tatsächlich über eine ziemlich flexible Methode zur Verarbeitung aller Arten von seltsamen Zeitformaten, und es ist keine spezielle Behandlung erforderlich. Wir mussten nicht einmal die "PM" entfernen, die zu den 24-Stunden-Zeiten hinzugefügt wurden. Es ist "PFM" (Pure Freakin 'Magic).
Die Dinge variieren ein wenig, abhängig von der SPRACHE, die Sie für Ihren Server ausgewählt haben, aber eine ganze Menge davon wird so oder so behandelt.
Und diese "Auto-Magie" -Konvertierungen sind nichts Neues. Sie gehen einen sehr langen Weg zurück.
quelle
Wenn Sie möchten, dass SQL Server versucht, es herauszufinden, verwenden Sie einfach CAST CAST ('was auch immer' AS datetime). Dies ist jedoch im Allgemeinen eine schlechte Idee. Es gibt Probleme mit internationalen Daten, die auftauchen würden. Um diese Probleme zu vermeiden, möchten Sie, wie Sie festgestellt haben, das kanonische ODBC-Format des Datums verwenden. Das Format 120, 20 ist das Format für nur zweistellige Jahre. Ich glaube nicht, dass SQL Server eine integrierte Funktion hat, mit der Sie ein vom Benutzer angegebenes Format bereitstellen können. Sie können Ihre eigenen schreiben und möglicherweise sogar eine finden, wenn Sie online suchen.
quelle
Konvertieren Sie die Zeichenfolge in MSSQL implizit in datetime
quelle
quelle