datetimeoffset (Transact-SQL)
Gilt für: SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-Endpunkt in Microsoft Fabric
Warehouse in Microsoft Fabric
Definiert ein Datum, das mit einer Uhrzeit eines Tages kombiniert wird, basierend auf einer 24-Stunden-Uhr wie Datetime2, und fügt das Zeitzonenbewusstsein basierend auf koordinierter Weltzeit (UTC) hinzu.
Beschreibung von datetimeoffset
Eigenschaft | Wert |
---|---|
Syntax | DATETIMEOFFSET [ ( Bruch sekundenpräzision ) ] |
Verwendung | DECLARE @MyDatetimeoffset DATETIMEOFFSET(7); CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7)); |
Standardformate für Zeichenfolgenliterale (wird für client down-level verwendet) | yyyy-MM-dd HH:mm:ss[.nnnnnnn] [{+|-}hh:mm] Weitere Informationen finden Sie im folgenden Abschnitt zur Abwärtskompatibilität für Clients auf down-Level. |
Datumsbereich | 0001-01-01 bis 9999-12-31 1. Januar 1 n. Chr. bis 31. Dezember 9999 |
Zeitbereich | 00:00:00 bis 23:59:59.9999999 |
Zeitzonenoffsetbereich | -14:00 bis +14:00 |
Elementbereiche | yyyy ist vier Ziffern, von bis 0001 9999 zu , die ein Jahr darstellen.MM ist zwei Ziffern, von 01 bis zu 12 , die einen Monat im angegebenen Jahr darstellen.dd ist zwei Ziffern, von bis 01 zu 31 je nach Monat, die einen Tag des angegebenen Monats darstellen.HH ist zwei Ziffern, von 00 bis zu 23 , die die Stunde darstellen.mm ist zwei Ziffern, von 00 bis zu 59 , die die Minute darstellen.ss ist zwei Ziffern, von 00 bis zu 59 , die die zweite darstellen.n ist null bis sieben Ziffern, von 0 bis zu 9999999 , die die Bruchteilsekunden darstellen.hh ist zwei Ziffern, die von -14 bis zu +14 .mm ist zwei Ziffern, die von 00 bis zu 59 . |
Zeichenlänge | Mindestens 26 Positionen (yy-MM-dd HH:mm:ss {+|-}hh:mm) bis 34 maximal (jjjj-MM-dd HH:mm:mm:ss.nnnnnn {+|-}hh:mm) |
Genauigkeit, Skalierung | Siehe folgende Tabelle. |
Speichergröße | 10 Byte, fixed ist der Standardwert mit der Standardpräzision von 100-ns Bruch sekunden. |
Genauigkeit | 100 Nanosekunden |
Standardwert | 1900-01-01 00:00:00 00:00 |
Calendar | Gregorianisch |
Benutzerdefinierte Sekundenbruchpräzision | Ja |
Berücksichtigung und Erhaltung des Zeitzonenoffsets | Ja |
Sommerzeit fähig | Nein |
Angegebene Dezimalstelle | Ergebnis (Genauigkeit, Dezimalstellen) | Spaltenlänge (in Bytes) | Genauigkeit in Millisekunden |
---|---|---|---|
datetimeoffset | (34, 7) | 10 | 7 |
datetimeoffset(0) | (26, 0) | 8 | 0 bis 2 |
datetimeoffset(1) | (28, 1) | 8 | 0 bis 2 |
datetimeoffset(2) | (29, 2) | 8 | 0 bis 2 |
datetimeoffset(3) | (30, 3) | 9 | 3 bis 4 |
datetimeoffset(4) | (31, 4) | 9 | 3 bis 4 |
datetimeoffset(5) | (32, 5) | 10 | 5 bis 7 |
datetimeoffset(6) | (33, 6) | 10 | 5 bis 7 |
datetimeoffset(7) | (34, 7) | 10 | 5 bis 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 analysierten und Zeitformaten für die Datums- und Uhrzeitteile von Datetimeoffset finden Sie unter Datum (Transact-SQL) und Uhrzeit (Transact-SQL).For information about alphabetical, numeric, uneparated, and time formats for the date and time parts of datetimeoffset, see date (Transact-SQL) and time (Transact-SQL)
ISO 8601 | BESCHREIBUNG |
---|---|
yyyy-MM-ddTHH:mm:ss[.nnnnnn][{+|-}hh:mm] | Diese beiden Formate sind von den Einstellungen für das Gebietsschema und SET DATEFORMAT sitzungsgebietsschema SET LANGUAGE nicht betroffen. Leerzeichen sind zwischen dem Datetimeoffset und den Datetime-Teilen 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 Sollte als 1999-12-12 19:30:30.12345Z . |
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 |
date |
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 |
datetimeoffset IS08601 |
2007-05-08 12:35:29.1234567 +12:15 |
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:
hh
ist zwei Ziffern, die zwischen00
und14
der Anzahl der Stunden im Zeitzonenoffset liegen.mm
ist zwei Ziffern( von00
bis zu59
), die die Anzahl der zusätzlichen Minuten im Zeitzonenoffset darstellen.+
(Plus) oder-
(Minus) ist das obligatorische Zeichen für einen Zeitzonenoffset. Dieses Zeichen gibt an, ob der Zeitzonenoffset von der UTC-Zeit hinzugefügt oder subtrahiert wird, um die lokale Zeit abzurufen. Der gültige Zeitzonenoffset liegt im Bereich von-14:00
bis+14:00
.
Der Zeitzonenoffsetbereich folgt dem W3C-XML-Standard für die XSD-Schemadefinition und unterscheidet sich geringfügig von der SQL 2003-Standarddefinition 12:59
zu +14:00
.
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. Die Standardmäßige Bruch sekundengenauigkeit 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 wird in der Datenbank für den Abruf beibehalten.
Der angegebene Zeitzonenoffset wird davon ausgegangen, dass die Sommerzeit (DST) fähig ist und für bestimmte Datumsstunden angepasst wird, die sich im DST-Zeitraum befinden.
Für den Datetimeoffset-Typ werden sowohl UTC- als auch lokale (für den persistenten oder konvertierten Zeitzonenoffset ) -Datetime-Wert beim Einfügen, Aktualisieren, Arithmetischen, Konvertieren oder Zuweisen von Vorgängen überprüft. Die Erkennung eines ungültigen UTC- oder lokalen Datumstimewerts (für den persistenten oder konvertierten Zeitzonenoffset) löst einen ungültigen Wertfehler aus. Ist z. B. in UTC gültig, 9999-12-31 10:10:00
aber Überläufe in der Ortszeit bis zum Zeitzonenoffset +13:50
.
Syntax der Zeitzonenkonvertierung
SQL Server 2016 (13.x) hat die AT TIME ZONE
Syntax eingeführt, um sommerfreundliche, universelle Zeitzonenkonvertierungen zu erleichtern. Diese Syntax ist besonders hilfreich beim Konvertieren von Daten ohne Zeitzonenversatz in Daten mit Zeitzonenversatz. Informationen zum Konvertieren in einen entsprechenden Datetimeoffset-Wert in einer Zielzeitzone finden Sie unter AT TIME ZONE.
Kompatibilität mit ANSI und ISO 8601
Die Complianceabschnitte ANSI und ISO 8601 der Artikel zu Datum und Uhrzeit gelten 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_WSTRor DBTYPE_STR |
Java.sql.String |
String oder SqString |
date | JJJJ-MM-TT | SQL_WVARCHAR oder SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String oder SqString |
datetime2 | yyyy-MM-dd HH:mm:ss[.nnnnnnn] | SQL_WVARCHAR oder SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String oder SqString |
datetimeoffset | yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm | SQL_WVARCHAR oder SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String oder SqString |
Microsoft Fabric-Unterstützung
In Microsoft Fabric können Sie derzeit keine Spalten mit dem Datentyp "datetimeoffset" erstellen, aber Sie können "datetimeoffset" zum Konvertieren von Daten mit der Funktion AT TIME ZONE (Transact-SQL) verwenden, z. B.:
SELECT
CAST(CAST('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS datetime2) AS PST
Konvertieren von date- und time-Daten
Wenn Sie in Datentypen für Datum und Uhrzeit konvertieren, lehnt SQL Server alle Werte ab, die nicht als Datums- oder Uhrzeitwerte erkannt werden können. Informationen zur Verwendung der CAST
Daten und CONVERT
Funktionen mit Datums- und Uhrzeitdaten finden Sie unter CAST und CONVERT.
In datetimeoffset-Datentyp konvertieren
Dieser Abschnitt enthält ein Beispiel für das Aktualisieren von Daten aus einem Datentyp ohne Offsets in eine neue Datetimeoffset-Datentypspalte .
Überprüfen Sie zunächst den Zeitzonennamen aus der sys.time_zone_info Systemkatalogansicht.
SELECT * FROM sys.time_zone_info WHERE name = 'Pacific Standard Time';
Im folgenden Beispiel wird zweimal die AT TIME ZONE-Syntax verwendet. Der Beispielcode erstellt eine Tabelle dbo.Audit
, fügt Daten hinzu, die mehrere Sommerzeitänderungen umfassen, und fügt eine neue Datetimeoffset-Spalte hinzu. Es wird davon ausgegangen, dass die AuditCreated
Spalte ein *datetime2-Datentyp ohne Offsets ist und mithilfe der UTC-Zeitzone geschrieben wurde.
In der UPDATE
Anweisung fügt die AT TIME ZONE
Syntax zuerst utc-Zeitzonenversatz zu den vorhandenen AuditCreated
Spaltendaten hinzu und konvertiert dann die Daten von UTC in Pacific Standard Time
, und passt die historischen Daten für jeden letzten Sommerzeitbereich im USA richtig an.
CREATE TABLE dbo.Audit (AuditCreated DATETIME2(0) NOT NULL);
GO
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('1/1/2024 12:00:00');
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('5/1/2024 12:00:00');
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('12/1/2024 12:00:00');
GO
ALTER TABLE dbo.Audit
ADD AuditCreatedOffset DATETIMEOFFSET(0) NULL;
GO
DECLARE @TimeZone VARCHAR(50);
SELECT @TimeZone = [name]
FROM sys.time_zone_info
WHERE [name] = 'Pacific Standard Time';
UPDATE dbo.Audit
SET AuditCreatedOffset = AuditCreated
AT TIME ZONE 'UTC' AT TIME ZONE @TimeZone
WHERE AuditCreatedOffset IS NULL;
GO
SELECT *
FROM dbo.Audit;
Hier ist das Resultset.
AuditCreated AuditCreatedOffset
------------------- --------------------------
2024-01-01 12:00:00 2024-01-01 04:00:00 -08:00
2024-05-01 12:00:00 2024-05-01 05:00:00 -07:00
2024-12-01 12:00:00 2024-12-01 04:00:00 -08:00
Konvertieren des Datentyps "datetimeoffset" in andere Datums- und Uhrzeittypen
Der folgende Abschnitt veranschaulicht die Abläufe bei der Konvertierung des datetimeoffset-Datentyps in andere Datums- und Uhrzeittypen.
Wenn Sie in Datum konvertieren, werden das Jahr, der Monat und der Tag kopiert. Der folgende Code zeigt die Ergebnisse der Konvertierung eines Datetimeoffset(4) -Werts in einen Datumswert .
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date DATE = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @date AS 'date';
Hier ist das Resultset.
@datetimeoffset date
------------------------------ ----------
2025-12-10 12:32:10.0000 +01:0 2025-12-10
Wenn die Konvertierung auf "time(n)" festgelegt ist, werden die Sekunden für Stunde, Minute, Sekunde und Bruchzahlen kopiert. Der Zeitzonenwert wird abgeschnitten. Wenn die Genauigkeit des Datetimeoffset(n) -Werts größer als die Genauigkeit des Zeitwerts (n) 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';
Hier ist das Resultset.
@datetimeoffset time
------------------------------- ------------
2025-12-10 12:32:10.1237 +01:00 12:32:10.124
Wenn Sie in "datetime" konvertieren, werden die Datums- und Uhrzeitwerte kopiert, und die Zeitzone wird abgeschnitten. Wenn die Bruchgenauigkeit des Datetimeoffset(n) -Werts größer als drei Stellen ist, wird der Wert abgeschnitten. 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';
Hier ist das Resultset.
@datetimeoffset datetime
------------------------------ -----------------------
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123
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';
Hier ist das Resultset.
@datetimeoffset @smalldatetime
------------------------------ -----------------------
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
Wenn die Konvertierung auf datetime2(n) festgelegt ist, werden Datum und Uhrzeit in den Datetime2-Wert kopiert, und die Zeitzone wird abgeschnitten. Wenn die Genauigkeit des Datetime2(n) -Werts größer als die Genauigkeit des Datetimeoffset(n) -Werts ist, werden die Bruch sekunden abgeschnitten, damit sie passen. 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';
Hier ist das Resultset.
@datetimeoffset @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00 1912-10-25 12:24:32.12
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. Implizite Konvertierungen oder explizite Konvertierungen, die keine Formatvorlage angeben, von Datums- und Uhrzeittypen in Zeichenfolgenliterale befinden sich im Standardformat der aktuellen Sitzung. 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. Jeder Zuordnungsvorgang von ODBC DATETIME Literalen in datetimeoffset-Typen verursacht eine implizite Konvertierung zwischen Datetime und diesem Typ, wie durch die Konvertierungsregeln definiert. |
ODBC TIME |
Siehe vorherige ODBC DATE Regel |
ODBC DATETIME |
Siehe vorherige ODBC DATE Regel |
Nur DATE |
Der Standardwert für 00:00:00 das TIME Teil ist . Die TIMEZONE Standardwerte für +00:00 |
Nur TIME |
Der Standardwert für 1900-1-1 das DATE Teil ist . Die TIMEZONE Standardwerte für +00:00 |
Nur TIMEZONE |
Standardwerte werden festgelegt |
DATE + TIME |
Die TIMEZONE Standardwerte für +00:00 |
DATE + TIMEZONE |
Nicht zulässig |
TIME + TIMEZONE |
Das DATUM-Webpart ist standardmäßig auf 1900-1-1 |
DATE + TIME + TIMEZONE |
Trivial |