Freigeben über


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 9999zu , 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 sehen Sie das Ergebnis.

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 zwischen 00 und 14 der Anzahl der Stunden im Zeitzonenoffset liegen.

  • mm ist zwei Ziffern( von 00 bis zu 59), 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 sehen Sie das Ergebnis.

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 sehen Sie das Ergebnis.

@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 sehen Sie das Ergebnis.

@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 sehen Sie das Ergebnis.

@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 sehen Sie das Ergebnis.

@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 sehen Sie das Ergebnis.

@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:00das TIME Teil ist . Die TIMEZONE Standardwerte für +00:00
Nur TIME Der Standardwert für 1900-1-1das 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