Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Punkt końcowy analizy SQL w usłudze Microsoft Fabric
Hurtownia danych w usłudze Microsoft Fabric
Baza 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-311 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:
hhto dwie cyfry z zakresu od00do14i reprezentujące liczbę godzin przesunięcia strefy czasowej.mmto dwie cyfry, od00do59, 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:00do+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 |