Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verschiedene Möglichkeiten zur Verwendung der SQL CONVERT-Datumsfunktion

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