Udostępnij za pomocą


datetimeoffset (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Definiuje datę, która jest połączona z godziną dnia na podstawie zegara 24-godzinnego, takiego jak data/godzina2, i dodaje świadomość strefy czasowej na podstawie uniwersalnego czasu koordynowanego (UTC).

opis datetimeoffset

Property Value
Syntax DATETIMEOFFSET [ ( precyzja ułamkowa sekund ) ]
Usage DECLARE @MyDatetimeoffset DATETIMEOFFSET(7);
CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7));
domyślne formaty literału ciągu (używane dla klienta na poziomie down-level) rrrr-MM-dd HH:mm:ss[.nnnnnnnnn] [{+|-}hh:mm]

Aby uzyskać więcej informacji, zobacz sekcję Zgodność z poprzednimi wersjami dla klientów na poziomie starszym , która znajduje się poniżej.
Zakres dat 0001-01-01 za pośrednictwem 9999-12-31

1 stycznia 1 CE do 31 grudnia 9999 CE
Zakres czasu 00:00:00 za pośrednictwem 23:59:59.9999999
zakres przesunięcia strefy czasowej -14:00 za pośrednictwem +14:00
Zakresy elementów yyyy to cztery cyfry, od 0001 do 9999, które reprezentują rok.

MM to dwie cyfry, od 01 do 12, które reprezentują miesiąc w określonym roku.
ddto dwie cyfry, począwszy od do 01 w zależności od 31 miesiąca, które reprezentują dzień określonego miesiąca.
HH to dwie cyfry, od 00 do 23, które reprezentują godzinę.
mm to dwie cyfry, od 00 do 59, które reprezentują minutę.
ss to dwie cyfry, od 00 do 59, które reprezentują drugą.
n to zero do siedmiu cyfr, od 0 do 9999999, które reprezentują ułamkowe sekundy.
hh to dwie cyfry z zakresu od -14 do +14.
mm to dwie cyfry z zakresu od 00 do 59.
Długość znaku 26 pozycji minimalnych (rrrr-MM-dd HH:mm:mm:ss {+|-}hh:mm) do 34 maksimum (rrrr-MM-dd HH:mm:ss.nnnnnnn {+|-}hh:mm)
Precyzja, skala Zobacz poniższą tabelę.
Rozmiar magazynu 10 bajtów, stała jest wartością domyślną z domyślną dokładnością ułamkową 100 ns.
Accuracy 100 nanosekund
Wartość domyślna 1900-01-01 00:00:00 00:00
Calendar Gregorian
zdefiniowana przez użytkownika precyzja ułamkowa sekundy Yes
Rozpoznawanie i zachowywanie strefy czasowej Yes
z zapisywaniem światła dziennego No
Określona skala Wynik (precyzja, skala) Długość kolumny (bajty) Precyzja ułamkowa sekund
datetimeoffset (34, 7) 10 7
datetimeoffset(0) (26, 0) 8 Od 0 do 2
datetimeoffset(1) (28, 1) 8 Od 0 do 2
datetimeoffset(2) (29, 2) 8 Od 0 do 2
datetimeoffset(3) (30, 3) 9 Od 3 do 4
datetimeoffset(4) (31, 4) 9 Od 3 do 4
datetimeoffset(5) (32, 5) 10 Od 5 do 7
datetimeoffset(6) (33, 6) 10 Od 5 do 7
datetimeoffset(7) (34, 7) 10 Od 5 do 7

Obsługiwane formaty literału ciągu dla elementu datetimeoffset

W poniższej tabeli wymieniono obsługiwane formaty literału ciągu ISO 8601 dla elementu datetimeoffset. Aby uzyskać informacje o formatach alfabetycznych, liczbowych, niesepatycznych i czasowych dla części daty i godziny elementu datetimeoffset, zobacz data i godzina.

ISO 8601 Description
yyyy-MM-ddTHH:mm:ss[.nnnnnnn][{+|-}hh:mm] Te dwa formaty nie mają wpływu na SET LANGUAGE ustawienia regionalne i SET DATEFORMAT sesji. Spacje nie są dozwolone między elementami datetimeoffset i datetime .
rrrr-MM-ddTHH:mm:ss[.nnnnnnn]Z (UTC) Ten format według definicji ISO wskazuje, że część data/godzina powinna być wyrażona w uniwersalnym czasie koordynowanym (UTC). Na przykład 1999-12-12 12:30:30.12345 -07:00 powinna być reprezentowana jako 1999-12-12 19:30:30.12345Z.

Poniższy przykład porównuje wyniki rzutowania ciągu do każdej daty i godziny typu danych.

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 ISO8601';

Oto zestaw wyników.

Typ danych 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 ISO8601 2007-05-08 12:35:29.1234567 +12:15

Przesunięcie strefy czasowej

Przesunięcie strefy czasowej określa przesunięcie strefy z UTC dla wartości godziny lub daty/godziny . Przesunięcie strefy czasowej może być reprezentowane jako [+|-] hh:mm:

  • hh to dwie cyfry z zakresu od 00 do 14 i reprezentujące liczbę godzin przesunięcia strefy czasowej.

  • mm to dwie cyfry, od 00 do 59, które reprezentują liczbę dodatkowych minut przesunięcia strefy czasowej.

  • + (plus) lub - (minus) jest obowiązkowym znakiem przesunięcia strefy czasowej. Ten znak wskazuje, czy przesunięcie strefy czasowej jest dodawane, czy odejmowane od czasu UTC w celu uzyskania czasu lokalnego. Prawidłowy zakres przesunięcia strefy czasowej wynosi od -14:00 do +14:00.

Zakres przesunięcia strefy czasowej jest zgodny ze standardem XML W3C dla definicji schematu XSD i różni się nieco od standardowej definicji 12:59 sql 2003 do +14:00.

Opcjonalna precyzja parametru typu ułamkowego w sekundach określa liczbę cyfr dla części ułamkowej sekund. Ta wartość może być liczbą całkowitą z 0 do 7 (100 nanosekund). Domyślna precyzja sekund ułamkowych to 100 ns (siedem cyfr dla części ułamkowej sekund).

Dane są przechowywane w bazie danych i przetwarzane, w porównaniu, posortowane i indeksowane na serwerze, jak w formacie UTC. Przesunięcie strefy czasowej jest zachowywane w bazie danych na potrzeby pobierania.

Przyjmuje się, że przesunięcie danej strefy czasowej jest uwzględniane w czasie letnim (DST) i dostosowane dla każdej daty /godziny , która przypada w okresie DST.

Dla typu datetimeoffset zarówno UTC, jak i lokalny (do trwałego lub przekonwertowanego przesunięcia strefy czasowej) wartość daty/godziny jest weryfikowana podczas operacji wstawiania, aktualizowania, arytmetyki, konwertowania lub przypisywania. Wykrywanie dowolnej nieprawidłowej wartości UTC lub lokalnej (do przesunięcia trwałej lub przekonwertowanej strefy czasowej) powoduje wystąpienie nieprawidłowego błędu wartości. Na przykład 9999-12-31 10:10:00 jest prawidłowy w formacie UTC, ale przepełnia się w czasie lokalnym do przesunięcia +13:50strefy czasowej .

Składnia konwersji strefy czasowej

Program SQL Server 2016 (13.x) wprowadził składnię AT TIME ZONE w celu ułatwienia konwersji strefy czasowej w świetle światła dziennego. Ta składnia jest szczególnie przydatna podczas konwertowania danych bez przesunięć strefy czasowej na dane z przesunięciami strefy czasowej. Aby przekonwertować na odpowiadającą wartość datetimeoffset w docelowej strefie czasowej, zobacz AT TIME ZONE (STREFA CZASOWA).

Zgodność ze standardami ANSI i ISO 8601

Sekcje zgodności ANSI i ISO 8601 artykułów daty igodziny mają zastosowanie do elementu datetimeoffset.

Zgodność z poprzednimi wersjami dla klientów na poziomie starszym

Niektórzy klienci na poziomie podrzędnym nie obsługują typów danych data, data, data/godzina2 i data/godzina/godzina.. W poniższej tabeli przedstawiono mapowanie typów między wystąpieniem najwyższego poziomu programu SQL Server a klientami na poziomie podrzędnym.

Typ danych programu SQL Server Domyślny format literału ciągu przekazywany do klienta na poziomie podrzędnym OdBC na poziomie dół OLEDB na poziomie dół JDBC na poziomie w dół Program SQLCLIENT na poziomie podrzędnym
time HH:mm:ss[.nnnnnnn] SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String lub SqString
date yyyy-MM-dd SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String lub SqString
datetime2 rrrr-MM-dd HH:mm:ss[.nnnnnnnnn] SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String lub SqString
datetimeoffset rrrr-MM-dd HH:mm:ss[.nnnnnnnnn] [+|-]hh:mm SQL_WVARCHAR lub SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String lub SqString

Obsługa usługi Microsoft Fabric

W usłudze Microsoft Fabric obecnie nie można tworzyć kolumn z typem danych datetimeoffset , ale możesz użyć elementu datetimeoffset do konwertowania danych za pomocą funkcji AT TIME ZONE , na przykład:

SELECT CAST (CAST ('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS DATETIME2) AS PST;

W bazie danych SQL usługi Microsoft Fabric: można użyć dokładności 7 cyfr, ale zdublowane dane w usłudze Fabric OneLake miałyby strefę czasową i siódmy czas przycinania dziesiętnego. Tego typu kolumny nie można użyć jako klucza podstawowego w tabelach w bazie danych SQL fabric.

Konwertowanie danych daty i godziny

Podczas konwertowania na typy danych daty i godziny program SQL Server odrzuca wszystkie wartości, których nie może rozpoznać jako daty lub godziny. Aby uzyskać informacje o korzystaniu z funkcji CAST i CONVERT z danymi daty i godziny, zobacz CAST i CONVERT.

Konwertowanie na typ danych datetimeoffset

Ta sekcja zawiera przykład aktualizowania danych z typu danych bez przesunięcia do nowej kolumny typu danych datetimeoffset .

Najpierw zweryfikuj nazwę strefy czasowej z widoku wykazu systemu sys.time_zone_info .

SELECT * FROM sys.time_zone_info WHERE name = 'Pacific Standard Time';

W poniższym przykładzie użyto składni AT TIME ZONE dwa razy. Przykładowy kod tworzy tabelę dbo.Audit, dodaje dane obejmujące wiele zmian czasu letniego i dodaje nową kolumnę datetimeoffset . Przyjęto założenie, że kolumna AuditCreated jest typem danych *datetime2 bez przesunięć i została zapisana przy użyciu strefy czasowej UTC.

W instrukcji UPDATE składnia AT TIME ZONE najpierw dodaje przesunięcie strefy czasowej UTC do istniejących AuditCreated danych kolumny, a następnie konwertuje dane z UTC na Pacific Standard Time, poprawnie dostosowując dane historyczne dla każdego ostatniego zakresu czasu letniego w Stanach Zjednoczonych.

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 AS 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;

Oto zestaw wyników.

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

Konwertowanie typu danych datetimeoffset na inne typy dat i godzin

W tej sekcji opisano, co się dzieje, gdy typ danych datetimeoffset jest konwertowany na inne typy danych daty i godziny.

Podczas konwertowania na datę kopiowany jest rok, miesiąc i dzień. Poniższy kod przedstawia wyniki konwertowania wartości datetimeoffset(4) na wartość daty .

DECLARE @datetimeoffset AS DATETIMEOFFSET (4) = '12-10-25 12:32:10 +01:00';
DECLARE @date AS DATE = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @date AS 'date';

Oto zestaw wyników.

@datetimeoffset                 date
------------------------------ ----------
2025-12-10 12:32:10.0000 +01:0 2025-12-10

Jeśli konwersja ma wartość time(n), kopiowane są godziny, minuty, sekundy i ułamkowe sekundy. Wartość strefy czasowej jest obcięta. Gdy precyzja wartości datetimeoffset(n) jest większa niż precyzja wartości time(n), wartość jest zaokrąglona w górę. Poniższy kod przedstawia wyniki konwertowania wartości datetimeoffset(4) na wartość time(3).

DECLARE @datetimeoffset AS DATETIMEOFFSET (4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time AS TIME (3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';

Oto zestaw wyników.

@datetimeoffset                 time
------------------------------- ------------
2025-12-10 12:32:10.1237 +01:00 12:32:10.124

Podczas konwertowania na datę/godzinę wartości daty i godziny są kopiowane, a strefa czasowa jest obcięta. Gdy ułamkowa precyzja datetimeoffset(n) wartość jest większa niż trzy cyfry, wartość jest obcięta. Poniższy kod przedstawia wyniki konwertowania wartości datetimeoffset(4) na wartość typu data/godzina .

DECLARE @datetimeoffset AS DATETIMEOFFSET (4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime AS DATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';

Oto zestaw wyników.

@datetimeoffset                datetime
------------------------------ -----------------------
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123

W przypadku konwersji na smalldatetime data i godziny są kopiowane. Minuty są zaokrąglane w górę w odniesieniu do wartości sekund, a sekundy są ustawione na 0. Poniższy kod przedstawia wyniki konwertowania wartości datetimeoffset(3) na wartość smalldatetime .

DECLARE @datetimeoffset AS DATETIMEOFFSET (3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime AS SMALLDATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';

Oto zestaw wyników.

@datetimeoffset                @smalldatetime
------------------------------ -----------------------
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00

Jeśli konwersja ma wartość datetime2(n), data i godzina zostaną skopiowane do wartości datetime2 , a strefa czasowa zostanie obcięta. Gdy precyzja wartości datetime2(n) jest większa niż precyzja wartości datetimeoffset(n), ułamkowe sekundy są obcinane w celu dopasowania. Poniższy kod przedstawia wyniki konwertowania wartości datetimeoffset(4) na wartość datetime2(3).

DECLARE @datetimeoffset AS DATETIMEOFFSET (4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 AS DATETIME2 (3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';

Oto zestaw wyników.

@datetimeoffset                    @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00    1912-10-25 12:24:32.12

Konwertowanie literałów ciągu na wartość datetimeoffset

Konwersje z literałów ciągów do typów daty i godziny są dozwolone, jeśli wszystkie części ciągów są w prawidłowych formatach. W przeciwnym razie zostanie zgłoszony błąd środowiska uruchomieniowego. Niejawne konwersje lub jawne konwersje, które nie określają stylu, od typów daty i godziny do literałów ciągu są w domyślnym formacie bieżącej sesji. W poniższej tabeli przedstawiono reguły konwertowania literału ciągu na typ danych datetimeoffset .

Literał ciągu wejściowego datetimeoffset(n)
ODBC DATE Literały ciągu ODBC są mapowane na typ danych typu data/godzina . Każda operacja przypisania z ODBC DATETIME literałów do typów datetimeoffset powoduje niejawną konwersję między datą/godziną a tym typem zgodnie z regułami konwersji.
ODBC TIME Zobacz poprzednią ODBC DATE regułę
ODBC DATETIME Zobacz poprzednią ODBC DATE regułę
DATE tylko Część jest domyślnie ustawiona TIME na 00:00:00. Wartości TIMEZONE domyślne: +00:00
TIME tylko Część jest domyślnie ustawiona DATE na 1900-1-1. Wartości TIMEZONE domyślne: +00:00
TIMEZONE tylko Podano wartości domyślne
DATE + TIME Wartości TIMEZONE domyślne: +00:00
DATE + TIMEZONE Nie zezwolono
TIME + TIMEZONE Domyślnie DATE część to 1900-1-1
DATE + TIME + TIMEZONE Trivial