Sdílet prostřednictvím


datetimeoffset (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabá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-31

1. 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:

  • hh je dvě číslice, které jsou v rozsahu od 00 a 14 představují počet hodin v posunu časového pásma.

  • mm je dvě číslice, od 00 do 59, 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:00 do +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