it-swarm.com.de

SQL Server String zu Datum Konvertierung

Ich möchte einen String wie diesen 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?

165
JosephStyons

SQL Server (2005, 2000, 7.0) bietet keine flexible oder gar nicht flexible Möglichkeit, eine beliebig strukturierte Datumszeit im Zeichenfolgenformat zu übernehmen und in den Datentyp datetime zu konvertieren.

Mit "willkürlich" meine ich "eine Form, die die Person, die sie geschrieben hat, wenn auch vielleicht nicht Sie oder ich oder jemand auf der anderen Seite des Planeten, als intuitiv und völlig offensichtlich erachten würde." Ehrlich gesagt bin ich mir nicht sicher, ob es einen solchen Algorithmus gibt.

32
Philip Kelley

Versuche dies

Cast('7/7/2011' as datetime)

und

Convert(varchar(30),'7/7/2011',102)

Weitere Informationen finden Sie unter CAST und CONVERT (Transact-SQL) .

271
gauravg

Führen Sie dies durch Ihren Abfrageprozessor. Es formatiert Daten und/oder Zeiten wie folgt und eine dieser Angaben sollte Ihnen das geben, wonach Sie suchen. Es wird nicht schwer sein, sich anzupassen:

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'
47
Taptronic

In SQL Server Denali können Sie etwas tun, das dem entspricht, was Sie suchen. Sie können jedoch nicht einfach eine willkürlich definierte verrückte Datumszeichenfolge übergeben und erwarten, dass SQL Server dies unterstützt. 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 Tokenformate, die Sie erwarten, dort angezeigt werden.

DECLARE @d DATETIME = '2008-10-13 18:45:19';

-- returns Oct-13/2008 18:45:19:
SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss');

-- returns NULL if the conversion fails:
SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

-- returns an error if the conversion fails:
SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

Ich empfehle Ihnen nachdrücklich, mehr Kontrolle zu übernehmen und Ihre Dateneingaben zu bereinigen. Die Tage, an denen die Leute Daten in einem beliebigen Format in ein Freitext-Formularfeld eingeben konnten, dürften jetzt weit hinter uns liegen. Wenn jemand am 9. August 2011 eintrifft, ist das der 9. August oder der 8. September? Wenn Sie ein Datum in einem Kalender-Steuerelement auswählen, kann die App das Format steuern. Egal, wie sehr Sie versuchen, das Verhalten Ihrer Benutzer vorherzusagen, sie finden immer eine mühsame Möglichkeit, ein Datum einzugeben, das Sie nicht geplant haben.

Bis Denali glaube ich jedoch, dass @Ovidiu 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.


PDATE für @dhergert:

SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us');
SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb');

Ergebnisse:

2008-10-15 22:06:32.000
2008-10-15 22:06:32.000

Sie müssen zuerst noch diese andere wichtige Information haben. Sie können natives T-SQL nicht verwenden, um zu bestimmen, ob 6/9/2012 ist der 9. Juni oder der 6. September.

42
Aaron Bertrand

Für dieses Problem verwende ich am besten eine CLR-Funktion in SQL Server 2005, die eine der Funktionen DateTime.Parse oder ParseExact verwendet, um den DateTime-Wert mit einem angegebenen Format zurückzugeben.

11
Ovidiu Pacurar

warum nicht versuchen

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

datumsformate finden Sie unter SQL Server Helper> SQL Server-Datumsformate

9
Scott Gollaglee

Benutze das:

SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

Die Umrechnungscodes finden Sie in der Tabelle in der offiziellen Dokumentation .

6
Simone

Wenn Sie sich persönlich mit beliebigen oder völlig fremden Formaten befassen, verwenden Sie einfach regexp, um die Abschnitte des gewünschten Datums abzurufen und eine gültige Datums-/Uhrzeitkomponente zu bilden.

3
SyWill

Diese Seite enthält einige Referenzen für alle angegebenen datetime-Konvertierungen, die für die CONVERT-Funktion verfügbar sind. Wenn Ihre Werte nicht in eines der akzeptablen Muster fallen, ist es meines Erachtens am besten, die ParseExact-Route zu wählen.

3
tvanfosson

Wenn Sie möchten, dass SQL Server es versucht, verwenden Sie einfach CAST CAST ('was auch immer' als Datum und Uhrzeit). Dies ist jedoch im Allgemeinen eine schlechte Idee. Es gibt Probleme mit internationalen Daten, die auftreten würden. Um diese Probleme zu vermeiden, sollten Sie das kanonische Format ODBC des Datums verwenden. Das ist das Format Nummer 120, 20 ist das Format für nur zweistellige Jahre. Ich glaube nicht, dass SQL Server über eine integrierte Funktion verfügt, mit der Sie dem Benutzer ein bestimmtes Format bereitstellen können. Sie können Ihre eigene schreiben und finden möglicherweise sogar eine, wenn Sie online suchen.

0
Will Rickards