datetimeoffset (Transact-SQL)
Gilt für:SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Hiermit wird ein Datum definiert, das mit einer Uhrzeit eines Tages basierend auf einem 24-Stunden-Uhr wie datetime2 kombiniert wird, und eine auf UTC (koordinierte Weltzeit) basierende Zeitzonenberücksichtigung wird hinzugefügt.
Beschreibung von datetimeoffset
Eigenschaft | Wert |
---|---|
Syntax | datetimeoffset [ (Sekundenbruchteil-Genauigkeit) ] |
Verwendung | DECLARE @MyDatetimeoffset datetimeoffset(7) CREATE TABLE Table1 ( Column1 datetimeoffset(7) ) |
Standardmäßige Formate der Zeichenfolgenliterale (wird für Downlevelclients verwendet) | YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm] Weitere Informationen finden Sie im nachfolgenden Abschnitt „Abwärtskompatibilität für Downlevelclients“. |
Datumsbereich | 0001-01-01 bis 9999-12-31 1. Januar 1 n. Chr. bis 31. Dezember 9999 |
Uhrzeitbereich | 00:00:00 bis 23:59:590,9999999 |
Zeitzonenoffsetbereich | -14:00 bis +14:00 |
Elementbereiche | Bei YYYY handelt es sich um vier Ziffern im Bereich von 0001 bis 9999, die ein Jahr darstellen. Bei MM handelt es sich um zwei Ziffern im Bereich von 01 bis 12, die im angegebenen Jahr einen Monat darstellen. Bei DD handelt es sich um zwei Ziffern im Bereich von 01 bis 31, die im angegebenen Monat einen Tag darstellen. Bei hh handelt es sich um zwei Ziffern im Bereich von 00 bis 23, die die Stunde darstellen. Bei mm handelt es sich um zwei Ziffern im Bereich von 00 bis 59, die die Minute darstellen. Bei ss handelt es sich um zwei Ziffern im Bereich von 00 bis 59, die die Sekunde darstellen. Bei n* handelt es sich um bis zu sieben Ziffern im Bereich von 0 bis 9999999, die die Sekundenbruchteile darstellen. Bei hh handelt es sich um zwei Ziffern im Bereich von -14 bis +14. Bei mm handelt es sich um zwei Ziffern im Bereich von 00 bis 59. |
Zeichenlänge | Mindestens 26 Positionen (YYYY-MM-DD hh:mm:ss {+|-}hh:mm) bis maximal 34 Positionen (YYYY-MM-DD hh:mm:ss.nnnnnnn {+|-}hh:mm) |
Genauigkeit, Dezimalstellen | Siehe Tabelle unten. |
Speichergröße | Standardmäßig 10 Bytes fest, wobei die Standardgenauigkeit in Sekundenbruchteilen 100 ns beträgt. |
Genauigkeit | 100 Nanosekunden |
Standardwert | 1900-01-01 00:00:00 00:00 |
Kalender | Gregorianisch |
Benutzerdefinierte Genauigkeit in Sekundenbruchteilen | Ja |
Beachtung und Beibehaltung des Zeitzonenoffsets | Ja |
Beachtung der Sommerzeit | Nein |
Angegebene Dezimalstelle | Ergebnis (Genauigkeit, Dezimalstellen) | Spaltenlänge (in Bytes) | Genauigkeit in Millisekunden |
---|---|---|---|
datetimeoffset | (34,7) | 10 | 7 |
datetimeoffset(0) | (26,0) | 8 | 0–2 |
datetimeoffset(1) | (28,1) | 8 | 0–2 |
datetimeoffset(2) | (29,2) | 8 | 0–2 |
datetimeoffset(3) | (30,3) | 9 | 3–4 |
datetimeoffset(4) | (31,4) | 9 | 3–4 |
datetimeoffset(5) | (32,5) | 10 | 5–7 |
datetimeoffset(6) | (33,6) | 10 | 5–7 |
datetimeoffset(7) | (34,7) | 10 | 5–7 |
Unterstützte Formate der Zeichenfolgenliterale für datetimeoffset
In der folgenden Tabelle werden die unterstützten ISO 8601-Zeichenfolgenliterale für datetimeoffset aufgelistet. Informationen zu alphabetischen, numerischen, nicht getrennten Formaten sowie zu Zeitformaten für die Datums- und Uhrzeitbestandteile von datetimeoffset finden Sie unter date (Transact-SQL) und time (Transact-SQL).
ISO 8601 | BESCHREIBUNG |
---|---|
YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] | Diese beiden Formate werden nicht von den Gebietsschemaeinstellungen für Sitzungen SET LANGUAGE und SET DATEFORMAT beeinflusst. Leerzeichen zwischen datetimeoffset- und datetime-Teilen sind nicht zulässig. |
YYYY-MM-DDThh:mm:ss[.nnnnnnn]Z (UTC) | Dieses Format gibt gemäß ISO-Definition an, dass der datetime-Teil in koordinierter Weltzeit (Coordinated Universal Time; UTC) ausgedrückt werden soll. Beispiel: 1999-12-12 12:30:30.12345 -07:00 soll als 1999-12-12 19:30:30.12345Z dargestellt werden. |
Zeitzonenoffset
Ein Zeitzonenoffset gibt den Zonenoffset der UTC-Zeit für einen time- oder einen datetime-Wert an. Der Zeitzonenoffset kann im Format [+|-] hh:mm dargestellt werden:
- Bei hh handelt es sich um zwei Ziffern im Bereich von 00 bis 14, die die Anzahl der Stunden im Zeitzonenoffset darstellen.
- Bei "mm" handelt es sich um zwei Ziffern im Bereich von 00 bis 59, die die Anzahl der zusätzlichen Minuten im Zeitzonenoffset darstellen.
- + (plus) oder – (minus) ist das erforderliche Zeichen für einen Zeitzonenoffset. Dies gibt an, ob der Zeitzonenoffset zur UTC-Zeit addiert oder von dieser subtrahiert wird, um die lokale Zeit zu bestimmen. Der gültige Zeitzonenoffset liegt im Bereich von -14: 00 bis +14: 00.
Der Zeitzonenoffsetbereich entspricht dem W3C XML-Standard für die XSD-Schemadefinition und weicht geringfügig von der SQL 2003-Standarddefinition (12:59 bis +14:00) ab.
Der optionale Typparameter Sekundenbruchteil-Genauigkeit gibt die Anzahl der Ziffern für den Bruchteil der Sekunden an. Dieser Wert kann eine ganze Zahl von 0 bis 7 (100 Nanosekunden) sein. Der Standardwert der Sekundenbruchteil-Genauigkeit beträgt 100 ns (sieben Ziffern für den Bruchteil der Sekunden).
Die Daten werden in der Datenbank gespeichert und auf dem Server entsprechend der UTC-Zeit verarbeitet, verglichen, sortiert und indiziert. Der Zeitzonenoffset bleibt in der Datenbank zum Abruf erhalten.
Es wird davon ausgegangen, dass für den angegebenen Zeitzonenoffset die Sommerzeit beachtet und für jeden angegebenen datetime-Wert, der in der Sommerzeit liegt, angepasst wird.
Beim datetimeoffset-Typ wird bei Einfüge-, Aktualisierungs-, Konvertierungs- oder Zuweisungsvorgängen oder bei arithmetischen Vorgängen sowohl der UTC-Wert als auch der (für den persistenten oder konvertierten Zeitzonenoffset) lokale datetime-Wert überprüft. Wird ein ungültiger UTC-Wert oder (für den persistenten oder konvertierten Zeitzonenoffset) lokaler datetime-Wert erkannt, wird ein Fehler wegen eines ungültigen Werts ausgelöst. 9999-12-31 10:10:00 ist z. B. im UTC-Format gültig, führt bei der lokalen Zeit aber zu einer Überschreitung des Zeitzonenoffsets +13:50.
Informationen zum Konvertieren eines Datums in einen entsprechenden datetimeoffset-Wert einer Zielzeitzone finden Sie unter AT TIME ZONE (Transact-SQL).
Kompatibilität mit ANSI und ISO 8601
Die Abschnitte zur Kompatibilität mit ANSI und ISO 8601 der Artikel date und time gelten auch für datetimeoffset.
Abwärtskompatibilität für Downlevelclients
Einige Downlevelclients unterstützen nicht die Datentypen time, date, datetime2 und datetimeoffset. In der folgenden Tabelle wird die Typzuordnung zwischen einer Instanz höherer Ebene in SQL Server und Downlevelclients gezeigt.
SQL Server-Datentyp | Standardmäßiges Format des an Downlevelclients übergebenen Zeichenfolgenliterals | ODBC früherer Versionen | OLEDB früherer Versionen | JDBC früherer Versionen | SQLCLIENT früherer Versionen |
---|---|---|---|---|---|
time | hh:mm:ss[.nnnnnnn] | SQL_WVARCHAR oder SQL_VARCHAR | DBTYPE_WSTR oder DBTYPE_STR | Java.sql.String | Zeichenfolge oder SqString |
date | JJJJ-MM-TT | SQL_WVARCHAR oder SQL_VARCHAR | DBTYPE_WSTR oder DBTYPE_STR | Java.sql.String | Zeichenfolge oder SqString |
datetime2 | YYYY-MM-DD hh:mm:ss[.nnnnnnn] | SQL_WVARCHAR oder SQL_VARCHAR | DBTYPE_WSTR oder DBTYPE_STR | Java.sql.String | Zeichenfolge oder SqString |
datetimeoffset | YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm | SQL_WVARCHAR oder SQL_VARCHAR | DBTYPE_WSTR oder DBTYPE_STR | Java.sql.String | Zeichenfolge oder SqString |
Konvertieren von Datums- und Uhrzeitdaten
Beim Konvertieren in date- und time-Datentypen lehnt SQL Server alle Werte ab, die nicht als Datum oder Uhrzeit erkannt werden. Informationen zur Verwendung der Funktionen CAST und CONVERT mit Datums- und Uhrzeitdaten finden Sie unter CAST und CONVERT (Transact-SQL).
Konvertieren des datetimeoffset-Datentyps in andere Datums- und Uhrzeittypen
Der folgende Abschnitt veranschaulicht die Abläufe bei der Konvertierung des datetimeoffset-Datentyps in andere Datums- und Uhrzeittypen.
Beim Konvertieren in date werden das Jahr, der Monat und der Tag kopiert. Der folgende Code zeigt die Ergebnisse der Konvertierung eines datetimeoffset(4)
-Werts in einen date
-Wert.
DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date date= @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @date AS 'date';
--Result
--@datetimeoffset date
-------------------------------- ----------
--2025-12-10 12:32:10.0000 +01:0 2025-12-10
--
--(1 row(s) affected)
Wenn ein Wert in time(n) konvertiert wird, werden die Stunde, Minute, Sekunde und die Sekundenbruchteile kopiert. Der Zeitzonenwert wird abgeschnitten. Wenn die Genauigkeit des datetimeoffset(n)-Werts höher als die Genauigkeit des time(n)-Werts ist, wird der Wert aufgerundet. Der folgende Code zeigt die Ergebnisse der Konvertierung eines datetimeoffset(4)
-Werts in einen time(3)
-Wert.
DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time time(3) = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';
--Result
--@datetimeoffset time
-------------------------------- ------------
-- 2025-12-10 12:32:10.1237 +01:00 12:32:10.124
--
--(1 row(s) affected)
Wenn ein Wert in datetime konvertiert wird, werden die Datums- und Zeitwerte kopiert, und die Zeitzone wird abgeschnitten. Wenn die Sekundenbruchteil-Genauigkeit des datetimeoffset(n)-Werts um mehr als drei Stellen abweicht, wird der Wert gekürzt. Der folgende Code zeigt die Ergebnisse der Konvertierung eines datetimeoffset(4)
-Werts in einen datetime
-Wert.
DECLARE @datetimeoffset datetimeoffset(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime datetime = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';
--Result
--@datetimeoffset datetime
-------------------------------- -----------------------
--2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123
--
--(1 row(s) affected)
Bei Konvertierungen in smalldatetime werden das Datum und die Stunden kopiert. Die Minuten werden in Bezug auf den Sekundenwert aufgerundet, und die Sekunden werden auf 0 festgelegt. Der folgende Code zeigt die Ergebnisse der Konvertierung eines datetimeoffset(3)
-Werts in einen smalldatetime
-Wert.
DECLARE @datetimeoffset datetimeoffset(3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime smalldatetime = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';
--Result
--@datetimeoffset @smalldatetime
-------------------------------- -----------------------
--1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
--
--(1 row(s) affected)
Bei Konvertierungen in datetime2(n) werden das Datum und die Zeit in einen datetime2-Wert konvertiert, und die Zeitzone wird abgeschnitten. Wenn die Sekundenbruchteil-Genauigkeit des datetime2(n)-Werts höher ist als die Genauigkeit des datetimeoffset(n)-Werts, wird der Wert gekürzt. Der folgende Code zeigt die Ergebnisse der Konvertierung eines datetimeoffset(4)
-Werts in einen datetime2(3)
-Wert.
DECLARE @datetimeoffset datetimeoffset(4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 datetime2(3)=@datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';
--Result
@datetimeoffset @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00 1912-10-25 12:24:32.12
--(1 row(s) affected)
Konvertieren von Zeichenfolgenliteralen in datetimeoffset
Konvertierungen von Zeichenfolgenliteralen in Datums- und Zeitwerte sind erlaubt, wenn alle Teile der Zeichenfolge in gültigen Formaten vorliegen. Andernfalls wird ein Laufzeitfehler ausgelöst. Wird bei impliziten oder expliziten Konvertierungen von Datums- und Zeitwerten in Zeichenfolgenliterale kein Stil angegeben, wird das Standardformat der aktuellen Sitzung verwendet. In der folgenden Tabelle werden die Regeln zum Konvertieren eines Zeichenfolgenliterals in den datetimeoffset-Datentyp dargestellt.
Eingabezeichenfolgenliteral | datetimeoffset(n) |
---|---|
ODBC DATE | Dem datetime-Datentyp werden ODBC-Zeichenfolgenliterale zugeordnet. Jede Zuweisungsoperation von ODBC DATETIME-Literalen zu datetimeoffset-Typen bewirkt eine in den Konvertierungsregeln definierte implizite Konvertierung zwischen datetime und diesen Typen. |
ODBC TIME | Siehe vorherige ODBC DATE-Regel. |
ODBC DATETIME | Siehe vorherige ODBC DATE-Regel. |
Nur DATE | Der TIME-Teil wird standardmäßig auf 00:00:00 festgelegt. TIMEZONE wird standardmäßig auf +00:00 festgelegt. |
Nur TIME | Der DATE-Teil wird standardmäßig auf 1900-1-1 festgelegt. TIMEZONE wird standardmäßig auf +00:00 festgelegt. |
Nur TIMEZONE | Standardwerte werden festgelegt |
DATE + TIME | TIMEZONE wird standardmäßig auf +00:00 festgelegt. |
DATE + TIMEZONE | Nicht zulässig |
TIME + TIMEZONE | Der DATE-Teil wird standardmäßig auf 1900-1-1 festgelegt. |
DATE + TIME + TIMEZONE | Trivial |
Beispiele
Im folgenden Beispiel werden die Ergebnisse der Umwandlung von einer Zeichenfolge in alle date- und time-Datentypen verglichen.
SELECT
CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time'
,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'
,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS
'smalldatetime'
,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'
,CAST('2007-05-08 12:35:29.1234567+12:15' AS datetime2(7)) AS
'datetime2'
,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS
'datetimeoffset'
,CAST('2007-05-08 12:35:29.1234567+12:15' AS datetimeoffset(7)) AS
'datetimeoffset IS08601';
Hier ist das Resultset.
Datentyp | Output |
---|---|
Time | 12:35:29. 1234567 |
Datum | 2007-05-08 |
Smalldatetime | 2007-05-08 12:35:00 |
Datetime | 2007-05-08 12:35:29.123 |
datetime2 | 2007-05-08 12:35:29. 1234567 |
datetimeoffset | 2007-05-08 12:35:29.1234567 +12:15 |