217 Stimmen

Sql Server String in Datum umwandeln

Ich möchte eine Zeichenkette wie diese konvertieren:

'10/15/2008 10:06:32 PM'

in den entsprechenden DATETIME-Wert in Sql Server.

Bei Oracle würde ich dies sagen:

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

Diese Frage impliziert, dass ich die Zeichenkette in eine der folgenden Kategorien zerlegen muss Standardformate und konvertieren Sie dann mit einem dieser Codes. Das erscheint mir für einen so banalen Vorgang lächerlich. Gibt es einen einfacheren Weg?

0 Stimmen

0 Stimmen

Die Frage sollte so bearbeitet werden, dass sie eine allgemeinere Frage zur Konvertierung von einem erwarteten Eingabeformat in ein neues Ausgabeformat stellt. Und die Antworten würden dann nicht nur seine, sondern auch die Fragen aller anderen abdecken. Die Frage ist zwar implizit gestellt, sollte aber explizit gestellt werden. Um keine unnötige Diskussion über die eigentliche Frage zu verursachen.

10voto

Ovidiu Pacurar Punkte 7967

Für dieses Problem die beste Lösung, die ich verwenden, ist eine CLR-Funktion in Sql Server 2005, die eine der DateTime.Parse oder ParseExact-Funktion verwendet, um den DateTime-Wert mit einem bestimmten Format zurückzugeben.

8voto

Scott Gollaglee Punkte 121

Kurze Antwort:

SELECT convert(date, '10/15/2011 00:00:00', 101) as [MM/dd/YYYY]

Andere Datumsformate finden Sie unter SQL Server-Hilfe > SQL Server-Datumsformate

6voto

Jared Punkte 957

Ich habe eine Minute gebraucht, um das herauszufinden, also hier ist es, falls es jemandem helfen könnte:

In SQL Server 2012 und höher können Sie diese Funktion verwenden:

SELECT DATEFROMPARTS(2013, 8, 19);

So habe ich die Teile des Datums extrahiert, die ich in diese Funktion einfügen wollte:

select
DATEFROMPARTS(right(cms.projectedInstallDate,4),left(cms.ProjectedInstallDate,2),right( left(cms.ProjectedInstallDate,5),2)) as 'dateFromParts'
from MyTable

5voto

Jeff Moden Punkte 3056

Ich weiß, dass dies ein sehr alter Beitrag mit einer ganzen Reihe von Antworten ist, aber viele Leute denken, dass sie entweder die Dinge auseinandernehmen und wieder zusammensetzen müssen, oder sie bestehen darauf, dass es keine Möglichkeit gibt, die ursprünglich vom Auftraggeber gewünschte Konvertierung durchzuführen.

Um zu überprüfen und hoffentlich eine einfache Antwort für andere mit der gleichen Frage zu bieten, fragte der OP, wie man "10/15/2008 10:06:32 PM" in eine DATETIME konvertieren. Nun, SQL Server hat einige Sprachabhängigkeiten für zeitliche Konvertierungen, aber wenn die Sprache Englisch oder etwas Ähnliches ist, wird dies ein einfaches Problem... machen Sie einfach die Konvertierung und kümmern Sie sich nicht um das Format. Zum Beispiel (und Sie können CONVERT oder CAST verwenden)...

 SELECT UsingCONVERT = CONVERT(DATETIME,'10/15/2008 10:06:32 PM')
        ,UsingCAST   = CAST('10/15/2008 10:06:32 PM' AS DATETIME)
;

... und das ergibt die folgenden Antworten, die beide richtig sind.

enter image description here

Wie sie in der Fernsehwerbung sagen: "Aber warten Sie! Bestellen Sie noch nicht! Für keine zusätzlichen Kosten kann es VIEL mehr!"

Sehen wir uns die wahre Macht der zeitlichen Konvertierungen mit DATETIME an und untersuchen teilweise den als DATETIME2 bekannten Fehler. Sehen Sie sich die verrückten Formate an, die DATETIME automatisch verarbeiten kann und DATETIME2 nicht. Führen Sie den folgenden Code aus und sehen Sie...

--===== Set the language for this example.
    SET LANGUAGE ENGLISH --Same a US-English
;
--===== Use a table constructor as if it were a table for this example.
 SELECT *
        ,DateTimeCONVERT  = TRY_CONVERT(DATETIME,StringDT)
        ,DateTimeCAST     = TRY_CAST(StringDT AS DATETIME)
        ,DateTime2CONVERT = TRY_CONVERT(DATETIME2,StringDT)
        ,DateTime2CAST    = TRY_CAST(StringDT AS DATETIME2)
   FROM (
         VALUES
         ('Same Format As In The OP'    ,'12/16/2001 01:51:01 PM')
        ,('Almost Normal'               ,'16 December, 2001 1:51:01 PM')
        ,('More Normal'                 ,'December 16, 2001 01:51:01 PM')
        ,('Time Up Front + Spaces'      ,'   13:51:01  16 December   2001')
        ,('Totally Whacky Format #01'   ,'  16  13:51:01  December   2001')
        ,('Totally Whacky Format #02'   ,'  16    December 13:51:01  2001  ')
        ,('Totally Whacky Format #03'   ,'  16    December 01:51:01  PM 2001  ')
        ,('Totally Whacky Format #04'   ,' 2001 16    December 01:51:01  PM ')
        ,('Totally Whacky Format #05'   ,' 2001    December 01:51:01  PM  16  ')
        ,('Totally Whacky Format #06'   ,' 2001 16    December  01:51:01 PM  ')
        ,('Totally Whacky Format #07'   ,' 2001 16    December  13:51:01 PM  ')
        ,('Totally Whacky Format #08'   ,' 2001 16  13:51:01 PM  December    ')
        ,('Totally Whacky Format #09'   ,'   13:51:01   PM  2001.12/16 ')
        ,('Totally Whacky Format #10'   ,'   13:51:01   PM  2001.December/16 ')
        ,('Totally Whacky Format #11'   ,'   13:51:01   PM  2001.Dec/16 ')
        ,('Totally Whacky Format #12'   ,'   13:51:01   PM  2001.Dec.16 ')
        ,('Totally Whacky Format #13'   ,'   13:51:01   PM  2001/Dec.16')
        ,('Totally Whacky Format #14'   ,'   13:51:01   PM  2001 . 12/16 ')
        ,('Totally Whacky Format #15'   ,'   13:51:01   PM  2001 . December / 16 ')
        ,('Totally Whacky Format #16'   ,'   13:51:01   PM  2001 . Dec /   16 ')
        ,('Totally Whacky Format #17'   ,'   13:51:01   PM  2001 . Dec .   16 ')
        ,('Totally Whacky Format #18'   ,'   13:51:01   PM  2001 / Dec .   16')
        ,('Totally Whacky Format #19'   ,'   13:51:01   PM  2001 . Dec -   16 ')
        ,('Totally Whacky Format #20'   ,'   13:51:01   PM  2001 - Dec -   16 ')
        ,('Totally Whacky Format #21'   ,'   13:51:01   PM  2001 - Dec .   16')
        ,('Totally Whacky Format #22'   ,'   13:51:01   PM  2001 - Dec /   16 ')
        ,('Totally Whacky Format #23'   ,'   13:51:01   PM  2001 / Dec -   16')
        ,('Just the year'               ,' 2001      ')
        ,('YYYYMM'                      ,' 200112      ')
        ,('YYYY MMM'                    ,'2001 Dec')
        ,('YYYY-MMM'                    ,'2001-Dec')
        ,('YYYY    .     MMM'           ,'2001    .     Dec')
        ,('YYYY    /     MMM'           ,'2001    /     Dec')
        ,('YYYY    -     MMM'           ,'2001    /     Dec')
        ,('Forgot The Spaces #1'        ,'2001December26')
        ,('Forgot The Spaces #2'        ,'2001Dec26')
        ,('Forgot The Spaces #3'        ,'26December2001')
        ,('Forgot The Spaces #4'        ,'26Dec2001')
        ,('Forgot The Spaces #5'        ,'26Dec2001 13:51:01')
        ,('Forgot The Spaces #6'        ,'26Dec2001 13:51:01PM')
        ,('Oddly, this doesn''t work'   ,'2001-12')
        ,('Oddly, this doesn''t work'   ,'12-2001')
        ) v (Description,StringDT)
;

Also, ja... SQL Server verfügt tatsächlich über eine ziemlich flexible Methode zur Behandlung aller Arten von seltsamen Zeitformaten, und es ist keine besondere Behandlung erforderlich. Wir mussten nicht einmal die "PM "s entfernen, die den 24-Stunden-Zeiten hinzugefügt wurden. Es ist "PFM" (Pure Freakin' Magic).

Je nach der Sprache, die Sie für Ihren Server ausgewählt haben, werden die Dinge ein wenig anders aussehen, aber vieles davon wird so oder so gehandhabt.

Und diese "selbstmagischen" Umwandlungen sind nichts Neues. Sie reichen sehr weit zurück.

1 Stimmen

Eine verrückte neue Antwort auf eine verrückte alte Frage. Danke!

0 Stimmen

Danke für das Feedback, @JosephStyons.

0 Stimmen

Dies ist eine schlechte Idee für jede Art von Magie, versuchen Sie dies wird zeigen, warum es dumm aussehen: SELECT UsingCONVERT = CONVERT(DATETIME,'2/3/2008 10:06:32 PM') ,UsingCAST = CAST('3/2/2008 10:06:32 PM' AS DATETIME)

4voto

luiscla27 Punkte 2980

Die am meisten hochgestuften Antworten hier sind guravg's y Taptronic's . Ich möchte jedoch einen Beitrag leisten.

Die spezifische Formatnummer, die sie von 0 bis 131 angezeigt haben, kann je nach Anwendungsfall variieren (siehe vollständige Nummernliste hier ), die eingegebene Zahl kann eine nicht-deterministische Zahl sein was bedeutet, dass das erwartete Ergebnisdatum von einer SQL SERVER INSTANZ zur anderen nicht konsistent ist, vermeiden Sie die Verwendung von der "Cast a String"-Ansatz aus demselben Grund.

Beginnend mit SQL Server 2005 und seiner Kompatibilitätsstufe 90, wurden implizite Datumsumwandlungen nicht mehr deterministisch. Datumsumwandlungen abhängig von SET LANGUAGE und SET DATEFORMAT, beginnend mit Stufe 90.

Nicht-deterministische Werte sind 0-100 , 106 , 107 , 109 , 113 , 130 . was zu Fehlern führen kann.


Die beste Option ist eine deterministische Einstellung, meine derzeitige Präferenz sind ISO Formate ( 12 , 112 , 23 , 126 ), da sie für IT-Mitarbeiter die gängigsten Anwendungsfälle zu sein scheinen.

Convert(varchar(30), '210510', 12)                   -- yymmdd
Convert(varchar(30), '20210510', 112)                -- yyyymmdd
Convert(varchar(30), '2021-05-10', 23)               -- yyyy-mm-dd
Convert(varchar(30), '2021-05-10T17:01:33.777', 126) -- yyyy-mm-ddThh:mi:ss.mmm (no spaces)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X