In diesem Artikel untersuchen wir die Verwendung der verschiedenen SQL CONVERT-Datumsformate in SQL Server.
Die Datumsinterpretation variiert zwischen verschiedenen Ländern. Angenommen, Sie haben eine globale SQL Server-Datenbank mit einer Tabelle, die ein bestimmtes Datumsformat enthält. Beispielsweise hat es eine Datumsspalte mit dem Wert 05.01.2020.
Wie interpretieren Sie es? Sehen wir uns die folgenden Interpretationen in verschiedenen Ländern an.
- USA:5. Januar 2020 (Standardformat – mm/tt/jjjj)
- Europa:1. Mai 2020 (Standardformat – TT/MM/JJJJ)
Darüber hinaus verwenden andere Länder andere Datumsformate:
- Türkei:tt.mm.jjjj
- Indien:tt-mm-jjjj
- Bulgarien:JJJJ-M-T
- Ungarn:JJJJ.MM.TT.
Weitere Informationen zu Datumsformaten nach Ländern finden Sie in Wikipedia.
Abgesehen davon möchten wir manchmal auch den Zeitstempel zusammen mit Datumsangaben einschließen. Einige Beispiele hierfür sind:
- 01.05.2020 10:00 Uhr
- 05.2020 14:00
- 05.2020 14:00 Uhr
- 01.05.2020 02:00:55 Uhr
Es ist nicht möglich, Datumsangaben in einer SQL Server-Tabelle in verschiedenen Formaten zu speichern, daher brauchen wir eine Möglichkeit, Datumsformate zu konvertieren. Lassen Sie uns die verschiedenen SQL CONVERT-Datumsformatmethoden untersuchen.
SQL CONVERT-Datumsfunktion
Normalerweise verwenden Datenbankprofis die SQL CONVERT-Datumsfunktion, um Datumsangaben in ein bestimmtes und konsistentes Format zu bringen. Dies wendet die Stilcodes für bestimmte Ausgabedaten an.
Syntax der Funktion CONVERT():
CONVERT(datatype, datetime [,style])
In der folgenden SQL-Abfrage konvertieren wir die Datumszeit mithilfe der Funktion CONVERT() in zwei Formate.
- MM/TT/JJ-Format:Stilcode 1
- MM/TT/JJJJ-Format:Stilcode 101
DECLARE @Inputdate datetime = '2019-12-31 14:43:35.863'; Select CONVERT(varchar,@Inputdate,1) as [mm/dd/yy], CONVERT(varchar,@Inputdate,101) as [mm/dd/yyyy]
Ebenso können wir verschiedene Stilcodes angeben, damit Sie Datumsangaben in Ihr gewünschtes Format umwandeln können.
SELECT '0' AS [StyleCode], 'Default format' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 0) AS [OutputFormat] UNION ALL SELECT '1' AS [StyleCode], 'USA - mm/dd/yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 1) AS [OutputFormat] UNION ALL SELECT '2' AS [StyleCode], 'ANSI - dd.mm.yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 2) AS [OutputFormat] UNION ALL SELECT '3' AS [StyleCode], 'British and French - dd/mm/yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 3) AS [OutputFormat] UNION ALL SELECT '4' AS [StyleCode], 'German - dd.mm.yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 4) AS [OutputFormat] UNION ALL SELECT '5' AS [StyleCode], 'Italian - dd-mm-yy ' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 5) AS [OutputFormat] UNION ALL SELECT '6' AS [StyleCode], 'Shortened month name -dd mon yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 6) AS [OutputFormat] UNION ALL SELECT '7' AS [StyleCode], 'Shortened month name - mon dd, yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 7) AS [OutputFormat] UNION ALL SELECT '8' AS [StyleCode], '24 hour time -hh:mm:ss' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 8) AS [OutputFormat] UNION ALL SELECT '9' AS [StyleCode], 'Default + milliseconds - mon dd yyyy hh:mm:ss:mmmAM (or PM)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 9) AS [OutputFormat] UNION ALL SELECT '10' AS [StyleCode], 'USA - mm-dd-yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 10) AS [OutputFormat] UNION ALL SELECT '11' AS [StyleCode], 'Japan -yy/mm/dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 11) AS [OutputFormat] UNION ALL SELECT '12' AS [StyleCode], 'ISO format -yymmdd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 12) AS [OutputFormat] UNION ALL SELECT '13' AS [StyleCode], 'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 13) AS [OutputFormat] UNION ALL SELECT '14' AS [StyleCode], ' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 14) AS [OutputFormat] UNION ALL SELECT '20' AS [StyleCode], 'ODBC canonical -yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 20) AS [OutputFormat] UNION ALL SELECT '21' AS [StyleCode], 'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 21) AS [OutputFormat] UNION ALL SELECT '22' AS [StyleCode], 'mm/dd/yy hh:mm:ss AM (or PM)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 22) AS [OutputFormat] UNION ALL SELECT '23' AS [StyleCode], 'ISO 8601 - yyyy-mm-dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 23) AS [OutputFormat] UNION ALL SELECT '100' AS [StyleCode], 'mon dd yyyy hh:mmAM' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 100) AS [OutputFormat] UNION ALL SELECT '101' AS [StyleCode], 'USA -mm/dd/yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 101) AS [OutputFormat] UNION ALL SELECT '102' AS [StyleCode], 'ANSI -yyyy.mm.dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 102) AS [OutputFormat] UNION ALL SELECT '103' AS [StyleCode], 'British/French -dd/mm/yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 103) AS [OutputFormat] UNION ALL SELECT '104' AS [StyleCode], 'German - dd.mm.yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 104) AS [OutputFormat] UNION ALL SELECT '105' AS [StyleCode], 'Italian -dd-mm-yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 105) AS [OutputFormat] UNION ALL SELECT '106' AS [StyleCode], 'Shortened month name -dd mon yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 106) AS [OutputFormat] UNION ALL SELECT '107' AS [StyleCode], 'Shortened month name -mon dd, yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 107) AS [OutputFormat] UNION ALL SELECT '108' AS [StyleCode], '24 hour time -hh:mm:ss' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 108) AS [OutputFormat] UNION ALL SELECT '109' AS [StyleCode], 'Default + milliseconds -mon dd yyyy hh:mm:ss:mmmAM (or PM) ' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 109) AS [OutputFormat] UNION ALL SELECT '110' AS [StyleCode], 'USA -mm-dd-yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 110) AS [OutputFormat] UNION ALL SELECT '111' AS [StyleCode], 'JAPAN -yyyy/mm/dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 111) AS [OutputFormat] UNION ALL SELECT '112' AS [StyleCode], 'ISO -yyyymmdd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 112) AS [OutputFormat] UNION ALL SELECT '113' AS [StyleCode], 'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 113) AS [OutputFormat] UNION ALL SELECT '114' AS [StyleCode], ' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 114) AS [OutputFormat] UNION ALL SELECT '120' AS [StyleCode], 'ODBC canonical- yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 120) AS [OutputFormat] UNION ALL SELECT '121' AS [StyleCode], 'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 121) AS [OutputFormat] UNION ALL SELECT '126' AS [StyleCode], 'ISO8601 -yyyy-mm-ddThh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 126) AS [OutputFormat] UNION ALL SELECT '127' AS [StyleCode], 'ISO8601 with time zone Z-yyyy-mm-ddThh:mm:ss.mmmZ' AS [Standard and Format], CONVERT(VARCHAR(100), Getdate(), 127) AS [OutputFormat] UNION ALL SELECT '131' AS [StyleCode], 'Arabic Hijri date - Islamic calendar' AS [Standard and Format], CONVERT(VARCHAR(100), Getdate(), 131) AS [OutputFormat]
Im folgenden Screenshot sehen Sie den Stilcode, seine Standards, Formate und Ausgabedaten.
Konvertieren von Datumsangaben mit der Funktion FORMAT()
In der obigen Funktion CONVERT() müssen wir Stilcodes für eine bestimmte Formatausgabe angeben. Normalerweise möchten wir uns diese Codes nicht merken müssen; Daher hat Microsoft die FORMAT()-Funktion in SQL Server 2012 eingeführt.
Die Syntax ist unten gezeigt.
FORMAT (Wert, Format [, Kultur])
Wert :Es erfordert einen Wert im unterstützten Format. Eine detaillierte Liste finden Sie in der Microsoft-Dokumentation.
Formatieren :Im Format können wir die Formatcodes oder Muster angeben, um die Eingabedatumsdaten zu verbergen. Das folgende Skript zeigt die Formatcodes, das Muster und das Ausgabeformat.
DECLARE @InputDate DATETIME = '2020-12-08 15:58:17.643' SELECT 'd' AS [FormatCode], 'Short Date Pattern' AS 'Pattern', Format(@InputDate, 'd') AS 'Output' UNION ALL SELECT 'D' AS [FormatCode], 'Long Date Pattern' AS 'Pattern', Format(@InputDate, 'D') AS 'Output' UNION ALL SELECT 'f' AS [FormatCode], 'Full Date/Time pattern (Short Time)' AS 'Pattern', Format(@InputDate, 'f') AS 'Output' UNION ALL SELECT 'F' AS [FormatCode], 'Full Date/Time pattern (Long Time)' AS 'Pattern', Format(@InputDate, 'F') UNION ALL SELECT 'g' AS [FormatCode], 'General Date/Time pattern (Short Time)' AS 'Pattern', Format(@InputDate, 'g') UNION ALL SELECT 'G' AS [FormatCode], 'General Date/Time pattern (Long Time)' AS 'Pattern', Format(@InputDate, 'G') AS 'Output' UNION ALL SELECT 'm' AS [FormatCode], 'Month/Day pattern' AS 'Pattern', Format(@InputDate, 'm') AS 'Output' UNION ALL SELECT 'O' AS [FormatCode], 'Round trip Date/Time pattern' AS 'Pattern', Format(@InputDate, 'O') AS 'Output' UNION ALL SELECT 'R' AS [FormatCode], 'RFC1123 pattern' AS 'Pattern', Format(@InputDate, 'R') AS 'Output' UNION ALL SELECT 's' AS [FormatCode], 'Sortable Date/Time pattern' AS 'Pattern', Format(@InputDate, 's') AS 'Output' UNION ALL SELECT 't' AS [FormatCode], 'Short Time pattern' AS 'Pattern', Format(@InputDate, 't') AS 'Output' UNION ALL SELECT 'T' AS [FormatCode], 'Long Time Pattern' AS 'Pattern', Format(@InputDate, 'T') AS 'Output' UNION ALL SELECT 'u' AS [FormatCode], 'Universal sortable Date/Time pattern' AS 'Pattern', Format(@InputDate, 'u') AS 'Output' UNION ALL SELECT 'U' AS [FormatCode], 'Universal Full Date/Time pattern' AS 'Pattern', Format(@InputDate, 'U') AS 'Output' UNION ALL SELECT 'Y' AS [FormatCode], 'Year Month pattern' AS 'Pattern', Format(@InputDate, 'Y') AS 'Output'
Kultur :Es ist ein optionales Argument und definiert die Kultur. Wenn wir keine Kultur angeben, verwendet SQL Server die Sprache der aktuellen Sitzung.
In der folgenden Abfrage konvertieren wir ein Datumsformat in eine angegebene Kultur. Wir müssen den Kulturcode angeben. Beispielsweise lautet der Kulturcode für die USA en-US und hi-IN für Indien.
Die Skripte verwenden das d Formatcode für kurze Datumsmuster.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760'; SELECT FORMAT (@d, 'd', 'en-US') AS 'US English', FORMAT (@d, 'd', 'no') AS 'Norwegian Result', FORMAT(@d, 'd', 'hi-IN') AS 'India', FORMAT(@d, 'd', 'ru-RU') AS 'Russian', FORMAT(@d, 'd', 'gl-ES') AS 'Galician (Spain)', FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English', FORMAT (@d, 'd', 'zu') AS 'Zulu', FORMAT ( @d, 'd', 'de-de' ) AS 'German', FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC)';
Sie erhalten das Datumsformat in einer bestimmten Kultur, wie unten gezeigt.
Wenn Sie die Datumsausgabe im vollständigen Datums-/Uhrzeitmuster (lange Zeit) wünschen, geben Sie den Formatcode F an, und es ändert schnell Ihr Datumsformat.
Im Datumsformat können Sie auch benutzerdefinierte Formate angeben und es konvertiert die eingegebene Datumszeichenfolge gemäß Ihren Anforderungen.
Um die benutzerdefinierten Zeichenfolgen anzugeben, können wir die folgenden Abkürzungen verwenden.
- dd:Tag des Monats (01 bis 31)
- dddd:Tagesschreibweise
- MM:Monatsnummer (01 bis 12)
- MMMM:Monatsschreibweise
- yy:Zweistellige Jahreszahl
- yyyy:Vierstellige Jahreszahl
- hh:Es ist die Stunde 01 bis 12
- HH:Es gibt 24 Std. Format Stunde 00 bis 23
- mm:Minute 00 bis 59
- ss:Sekunde von 00 bis 59
- tt:AM oder PM
Im folgenden Skript haben wir die Eingabedatumsformate mithilfe der obigen Abkürzungen oder Codes in mehrere Formate konvertiert.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760'; SELECT FORMAT (@d,'dd/MM/yyyy ') as [Date Format 1] , FORMAT (@d, 'dd/MM/yyyy, hh:mm:ss ') as [Date Format 2] , FORMAT(@d,'yyyy-MM-dd HH:mm:ss')as [Date Format 3] , FORMAT(@d,'Dd MMM yyyy HH:mm:ss')as [Date Format 4] , FORMAT(@d,'MMM d yyyy h:mm:ss')as [Date Format 5] , FORMAT (@d, 'dddd, MMMM, yyyy')as [Date Format 6] , FORMAT (@d, 'MMM dd yyyy') as [Date Format 7] , FORMAT (@d, 'MM.dd.yy') as [Date Format 8] , FORMAT (@d, 'MM-dd-yy') as [Date Format 9] , FORMAT (@d, 'hh:mm:ss tt')as [Date Format 10] , FORMAT (@d, 'd-M-yy')as [Date Format 11] , FORMAT(@d,'MMMM dd,yyyy')as [Date Format 12]
Mit AT TIME ZONE in SQL Server 2016 oder höher
Verschiedene Länder folgen verschiedenen Zeitzonen. Normalerweise folgen diese Zeitzonen dem Offset von der koordinierten Weltzeit (UTC). Einige Beispiele für Zeitzonen sind:
- Australische zentrale Sommerzeit:UTC +10:30
- Indische Standardzeit:UTC +5:30
- Mountain Daylight Time:UTC-6
- Singapur-Zeit:UTC+8
- Zentrale Sommerzeit:UTC-5
Eine detaillierte Liste der Zeitzonen finden Sie in diesem Artikel.
Viele Länder folgen der Sommerzeit und die Uhr wird je nach Zeitzone um 1 Stunde (oder 30-45 Minuten) angepasst. Beispielsweise folgte die Central Daylight Time dem folgenden Zeitplan:
- Standardzeit begann:1. November 2020 02:00 Uhr Ortszeit. Uhren wurden eine Stunde zurückgestellt.
- Die Standardzeit endet am 14. März 2021 um 02:00 Uhr Ortszeit. Die Uhren werden um eine Stunde vorgestellt.
SQL Server kennt diese Zeitzonen und die Sommerzeit nicht. Normalerweise folgt eine Organisation den UTC-Zonen, da keine Änderungen erforderlich sind.
Wie können wir Zeitzonen in SQL Server konvertieren?
Sie können AT TIME ZONE ab SQL Server 2016 verwenden und die Zeitzonen konvertieren. In der Abfrage unten werden Daten für die Central Standard Time, India Standard Time und Samoa Standard Time angezeigt.
Declare @DateinUTC datetime2='2020-11-01 02:00:00' select @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time' as 'Central Standard Time' , @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time' as 'India Standard Time', @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Samoa Standard Time' as 'Samoa Standard Time', @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Dateline Standard Time' as 'Dateline Standard Time'
Um die unterstützten Zeitzonen zu erfahren, können Sie sys.time_zone_info abfragen und gibt die Zeitzone und den Offset zurück.
Sie können dann die Zeitzonen filtern, in denen derzeit die Sommerzeit gilt.
Select * from sys.time_zone_info where is_currently_dst=1
Betrachten wir nun die Sommerzeit für die Eastern Time.
- Die Sommerzeit begann – Sonntag, 8. März 2020 um 2:00 Uhr.
- Die Sommerzeit endete am Sonntag, den 1. November 2020 um 02:00 Uhr.
Konvertieren Sie Ihre UTC-Zone in die Eastern Standard Time, und Sie können die Auswirkungen der Sommerzeit beobachten.
DECLARE @PreDST datetime = '2020-03-08 06:59:00', @PostDST datetime = '2020-03-08 07:00:00'; SELECT @PreDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST], @PostDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST];
Nützliche Punkte für die Verwendung von SQL CONVERT-Datumsformaten
Bewerten Sie Ihre Anwendungsanforderungen und wählen Sie den geeigneten Datentyp date, SmallDateTime, DateTime, DateTime2 und DateTimeOffset.
Sie können das Datumsformat mit den SQL-Funktionen CONVERT date und FORMAT konvertieren; Es ist jedoch ratsam, das Format zu verwenden, das Ihren Workloads am ehesten entspricht. Dadurch vermeiden Sie die explizite Datumsumwandlung.
Sie können die Sommerzeit in SQL Server berücksichtigen, indem Sie die Funktion AT TIME ZONE verwenden, die von SQL
ausgeht