Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Definuje datum, které se kombinuje s časem dne na základě 24hodinových hodin, jako je datetime2, a přidává povědomí o časovém pásmu na základě koordinovaného univerzálního času (UTC).
Popis datetimeoffset
| Property | Value |
|---|---|
| Syntax | DATETIMEOFFSET [ ( desetinná přesnost sekund ) ] |
| Usage | DECLARE @MyDatetimeoffset DATETIMEOFFSET(7);CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7)); |
| výchozí formáty řetězcového literálu (používané pro klienta nižší úrovně) | yyyy-MM-dd HH:mm:ss[.nnnnnnnn] [{+|-}hh:mm] Další informace najdete v části Zpětná kompatibilita pro klienty nižší úrovně , která následuje. |
| Rozsah dat |
0001-01-01 prostřednictvím 9999-12-311. ledna 1 až 31. prosince 9999 CE |
| Časový rozsah |
00:00:00 prostřednictvím 23:59:59.9999999 |
| rozsah posunu časového pásma |
-14:00 prostřednictvím +14:00 |
| Rozsahy elementů |
yyyy je čtyři číslice v rozsahu od 0001 roku 9999, který představuje rok.MM jsou dvě číslice v rozsahu od 01 po 12, které představují měsíc v zadaném roce.dd je dvě číslice v závislosti 01 na 31 měsíci, které představují den zadaného měsíce.HH jsou dvě číslice, od 00 po 23, které představují hodinu.mm jsou dvě číslice, od 00 po 59, které představují minutu.ss jsou dvě číslice v rozsahu od 00 po 59, které představují sekundu.n je nula až sedm číslic, od 0 do 9999999, které představují desetinné sekundy.hh je dvě číslice, které jsou v rozsahu od -14 do +14.mm je dvě číslice, které jsou v rozsahu od 00 do 59. |
| Délka znaku | Minimálně 26 pozic (yyyy-MM-dd HH:mm:ss {+|-}hh:mm) až 34 maximum (y-MM-dd HH:mm:ss.nnnnn {+|-}hh:mm) |
| Přesnost, měřítko | Podívejte se na následující tabulku. |
| Velikost úložiště | 10 bajtů, pevná je výchozí hodnota s výchozí desetinnou desetinnou přesností sekundy. |
| Accuracy | 100 nanosekund |
| Výchozí hodnota | 1900-01-01 00:00:00 00:00 |
| Calendar | Gregorian |
| přesnost desetinné sekundy definované uživatelem | Yes |
| posun časového pásma s vědomím a zachováním | Yes |
| s podporou letního času | No |
| Zadané škálování | Výsledek (přesnost, měřítko) | Délka sloupce (bajty) | Přesnost desetinné sekundy |
|---|---|---|---|
| datetimeoffset | (34, 7) | 10 | 7 |
| datetimeoffset(0) | (26, 0) | 8 | 0 až 2 |
| datetimeoffset(1) | (28, 1) | 8 | 0 až 2 |
| datetimeoffset(2) | (29, 2) | 8 | 0 až 2 |
| datetimeoffset(3) | (30, 3) | 9 | 3 až 4 |
| datetimeoffset(4) | (31, 4) | 9 | 3 až 4 |
| datetimeoffset(5) | (32, 5) | 10 | 5 až 7 |
| datetimeoffset(6) | (33, 6) | 10 | 5 až 7 |
| datetimeoffset(7) | (34, 7) | 10 | 5 až 7 |
Podporované formáty řetězcového literálu pro datetimeoffset
Následující tabulka uvádí podporované formáty řetězcového literálu ISO 8601 pro datetimeoffset. Informace o abecedním, číselném, neprůhledovém formátu a formátu času pro části datetimeoffset data a času najdete v tématu datum a čas.
| ISO 8601 | Description |
|---|---|
| yyyy-MM-ddTHH:mm:ss[.nnnnnnn][{+|-}hh:mm] | Tyto dva formáty nejsou ovlivněny SET LANGUAGE nastavením národního prostředí relace.SET DATEFORMAT Mezery nejsou povolené mezi datetimeoffset a částmi datetime . |
| yyyy-MM-ddTHH:mm:ss[.nnnnnnnn]Z (UTC) | Tento formát podle definice ISO označuje, že část datetime by měla být vyjádřena ve standardu UTC (Coordinated Universal Time). Například 1999-12-12 12:30:30.12345 -07:00 by měla být reprezentována jako 1999-12-12 19:30:30.12345Z. |
Následující příklad porovnává výsledky přetypování řetězce k jednotlivým kalendářním a času datového typu.
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';
Tady je soubor výsledků.
| Datový typ | 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 |
Posun časového pásma
Posun časového pásma určuje posun zóny od času UTC pro hodnotu času nebo data a času . Posun časového pásma může být reprezentován jako [+|-] hh:mm:
hhje dvě číslice, které jsou v rozsahu od00a14představují počet hodin v posunu časového pásma.mmje dvě číslice, od00do59, které představují počet dalších minut v posunu časového pásma.+(plus) nebo-minus je povinné znaménko pro posun časového pásma. Toto znaménko označuje, jestli je posun časového pásma přičítaný nebo odečítaný od času UTC, aby se získal místní čas. Platný rozsah posunu časového pásma je od-14:00do+14:00.
Rozsah posunu časového pásma se řídí standardem W3C XML pro definici schématu XSD a mírně se liší od standardní definice 12:59 SQL 2003 až +14:00po .
Volitelná přesnost parametru typu desetinné sekundy určuje počet číslic pro zlomkovou část sekund. Tato hodnota může být celé číslo s hodnotou 0 až 7 (100 nanosekund). Výchozí desetinná přesnost sekund je 100 ns (sedm číslic pro zlomkovou část sekund).
Data se ukládají v databázi a zpracovávají se, porovnávala, seřadila a indexovala na serveru jako ve standardu UTC. Posun časového pásma je zachován v databázi pro načtení.
U daného posunu časového pásma se předpokládá, že jde o letní čas (DST) a upraví se pro každé dané datum a čas , který je v období DST.
U typu datetimeoffset se při vkládání, aktualizaci, aritmetice, aritmetice, převodu nebo přiřazování ověřuje hodnota data atime ( k trvalému nebo převedenému posunu časového pásma). Detekce jakéhokoli neplatného času UTC nebo místního (na trvalý nebo převedený posun časového pásma ) vyvolá chybu neplatné hodnoty. Například 9999-12-31 10:10:00 je platný v UTC, ale přeteče v místním čase do posunu časového pásma +13:50.
Syntaxe převodu časového pásma
SQL Server 2016 (13.x) zavedl AT TIME ZONE syntaxi pro usnadnění převodů univerzálního časového pásma s podporou letních úspor. Tato syntaxe je zvlášť užitečná při převodu dat bez posunů časového pásma na data s posuny časových pásem. Pokud chcete převést na odpovídající hodnotu datetimeoffset v cílovém časovém pásmu, přečtěte si téma AT TIME ZONE.
DODRŽOVÁNÍ PŘEDPISŮ ANSI a ISO 8601
Oddíly dodržování předpisů ANSI a ISO 8601 pro články o datu a čase platí pro datetimeoffset.
Zpětná kompatibilita pro klienty nižší úrovně
Někteří klienti nižší úrovně nepodporují datové typy time, date, datetime2 a datetimeoffset. Následující tabulka ukazuje mapování typů mezi instancí SQL Serveru na vyšší úrovni a klienty nižší úrovně.
| Datový typ SQL Serveru | Výchozí formát literálu řetězce předaný klientovi nižší úrovně | Rozhraní ODBC nižší úrovně | OLEDB nižší úrovně | JDBC nižší úrovně | SQLCLIENT nižší úrovně |
|---|---|---|---|---|---|
| time | HH:mm:ss[.nnnnnnn] |
SQL_WVARCHAR nebo SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String nebo SqString |
| date | yyyy-MM-dd |
SQL_WVARCHAR nebo SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String nebo SqString |
| datetime2 | yyyy-MM-dd HH:mm:ss[.nnnnnnn] |
SQL_WVARCHAR nebo SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String nebo SqString |
| datetimeoffset | yyyy-MM-dd HH:mm:ss[.nnnnnnnn] [+|-]hh:mm |
SQL_WVARCHAR nebo SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String nebo SqString |
Podpora Microsoft Fabric
V Microsoft Fabric v současné době nemůžete vytvářet sloupce s datovým typem datetimeoffset , ale můžete použít datetimeoffset k převodu dat pomocí funkce AT TIME ZONE , například:
SELECT CAST (CAST ('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS DATETIME2) AS PST;
V databázi Microsoft Fabric SQL je možné použít přesnost 7 číslic, ale zrcadlení dat do Fabric OneLake by mělo časové pásmo a sedmé desetinné číslo oříznout. Tento typ sloupce nelze použít jako primární klíč v tabulkách v databázi Fabric SQL.
Převod dat data a času
Při převodu na datové typy data a času SQL Server odmítne všechny hodnoty, které nedokáže rozpoznat jako kalendářní data nebo časy. Informace o použití funkcí CAST a CONVERT s daty data a času naleznete v tématu CAST a CONVERT.
Převod na datový typ datetimeoffset
Tato část obsahuje příklad aktualizace dat z datového typu bez posunů na nový sloupec datového typu datetimeoffset .
Nejprve v zobrazení katalogu systému sys.time_zone_info ověřte název časového pásma.
SELECT * FROM sys.time_zone_info WHERE name = 'Pacific Standard Time';
Následující příklad používá syntaxi AT TIME ZONE dvakrát. Vzorový kód vytvoří tabulku dbo.Audit, přidá data, která zahrnují více změn letního času, a přidá nový sloupec datetimeoffset . Předpokládáme, že AuditCreated sloupec je datový typ *datetime2 bez posunů a byl zapsán pomocí časového pásma UTC.
UPDATE V příkazu AT TIME ZONE syntaxe nejprve přidá posun časového pásma UTC k existujícím AuditCreated datům sloupce a pak převede data z UTC na Pacific Standard Time, správně upraví historická data pro každý časový rozsah letního času v USA.
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;
Tady je soubor výsledků.
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
Převod datového typu datetimeoffset na jiné typy data a času
Tato část popisuje, co se stane při převodu datového typu datetimeoffset na jiné datové typy data a času.
Při převodu na datum se zkopíruje rok, měsíc a den. Následující kód ukazuje výsledky převodu hodnoty datetimeoffset(4) na hodnotu data .
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';
Tady je soubor výsledků.
@datetimeoffset date
------------------------------ ----------
2025-12-10 12:32:10.0000 +01:0 2025-12-10
Pokud je převod na čas(n), zkopíruje se hodina, minuta, sekunda a zlomkové sekundy. Hodnota časového pásma je zkrácena. Pokud je přesnost hodnoty datetimeoffset(n) větší než přesnost hodnoty time(n), hodnota se zaokrouhlí nahoru. Následující kód ukazuje výsledky převodu hodnoty datetimeoffset(4) na hodnotu 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';
Tady je soubor výsledků.
@datetimeoffset time
------------------------------- ------------
2025-12-10 12:32:10.1237 +01:00 12:32:10.124
Při převodu na datum a čas se hodnoty data a času zkopírují a časové pásmo se zkrátí. Pokud je desetinná přesnost datetimeoffset(n) hodnota větší než tři číslice, je hodnota zkrácena. Následující kód ukazuje výsledky převodu hodnoty datetimeoffset(4) na hodnotu datetime .
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';
Tady je soubor výsledků.
@datetimeoffset datetime
------------------------------ -----------------------
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123
Pro převody na smalldatetime se datum a hodiny zkopírují. Minuty se zaokrouhlují nahoru s ohledem na hodnotu sekund a sekundy jsou nastavené na 0. Následující kód ukazuje výsledky převodu hodnoty datetimeoffset(3) na hodnotu 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';
Tady je soubor výsledků.
@datetimeoffset @smalldatetime
------------------------------ -----------------------
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
Pokud je převod na datetime2(n),zkopíruje se datum a čas do hodnoty datetime2 a časové pásmo se zkrátí. Pokud je přesnost hodnoty datetime2(n) větší než přesnost hodnoty datetimeoffset(n), zkrátí se desetinné sekundy tak, aby odpovídaly. Následující kód ukazuje výsledky převodu hodnoty datetimeoffset(4) na hodnotu 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';
Tady je soubor výsledků.
@datetimeoffset @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00 1912-10-25 12:24:32.12
Převod řetězcových literálů na datetimeoffset
Převody z řetězcových literálů na typy data a času jsou povoleny, pokud jsou všechny části řetězců v platných formátech. V opačném případě se vyvolá chyba modulu runtime. Implicitní převody nebo explicitní převody, které nezadávají styl, od typů data a času po řetězcové literály jsou ve výchozím formátu aktuální relace. Následující tabulka uvádí pravidla pro převod řetězcového literálu na datový typ datetimeoffset .
| Literál vstupního řetězce | datetimeoffset(n) |
|---|---|
ODBC DATE |
Řetězcové literály ODBC se mapují na datový typ datetime . Jakákoli operace přiřazení z ODBC DATETIME literálů do typů datetimeoffset způsobí implicitní převod mezi datetime a tímto typem, jak je definováno pravidly převodu. |
ODBC TIME |
Zobrazit předchozí ODBC DATE pravidlo |
ODBC DATETIME |
Zobrazit předchozí ODBC DATE pravidlo |
DATE pouze |
Výchozí hodnota TIME části 00:00:00je . Výchozí TIMEZONE hodnota je +00:00 |
TIME pouze |
Výchozí hodnota DATE části 1900-1-1je . Výchozí TIMEZONE hodnota je +00:00 |
TIMEZONE pouze |
Zadají se výchozí hodnoty. |
DATE + TIME |
Výchozí TIMEZONE hodnota je +00:00 |
DATE + TIMEZONE |
Není povoleno |
TIME + TIMEZONE |
Výchozí hodnota DATE části 1900-1-1 |
DATE + TIME + TIMEZONE |
Trivial |