Dela via


datetimeoffset (Transact-SQL)

gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-analysslutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL-databas i Microsoft Fabric

Definierar ett datum som kombineras med en tid på en dag baserat på en 24-timmarsklocka som datetime2 och lägger till tidszonsmedvetenhet baserat på COORDINATED Universal Time (UTC).

beskrivning av datetimeoffset

Fastighet Värde
Syntax DATETIMEOFFSET [ ( precision för bråk sekunder ) ]
Användning DECLARE @MyDatetimeoffset DATETIMEOFFSET(7);
CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7));
Standardsträngliterala format (används för klient på nednivå) åååå-MM-dd HH:mm:ss[.nnnnnnn] [{+|-}hh:mm]

Mer information finns i avsnittet Bakåtkompatibilitet för klienter på nednivå som följer.
Datumintervall 0001-01-01 genom 9999-12-31

1 januari, 1 CE till 31 december 9999 CE
tidsintervall 00:00:00 genom 23:59:59.9999999
Tidszonsförskjutningsintervall -14:00 genom +14:00
elementintervall yyyy är fyra siffror, från till och med 00019999, som representerar ett år.

MM är två siffror, från 01 till 12, som representerar en månad under det angivna året.
dd är två siffror, från 01 till 31 beroende på månad, som representerar en dag i den angivna månaden.
HH är två siffror, från 00 till 23, som representerar timmen.
mm är två siffror, från 00 till 59, som representerar minuten.
ss är två siffror, från 00 till 59, som representerar den andra.
n är noll till sju siffror, från 0 till 9999999, som representerar bråksekunderna.
hh är två siffror som sträcker sig från -14 till +14.
mm är två siffror som sträcker sig från 00 till 59.
Teckenlängd Minst 26 positioner (å-MM-dd HH:mm:ss {+|-}hh:mm) till max 34 (åååå-MM-dd HH:mm:ss.nnnnnnnn {+|-}hh:mm)
Precision, skala Se följande tabell.
Lagringsstorlek 10 byte, fast är standardvärdet med standardvärdet 100-ns bråkdels sekund precision.
Noggrannhet 100 nanosekunder
Standardvärde 1900-01-01 00:00:00 00:00
Kalender Gregoriansk
Användardefinierad bråkdels sekundprecision Ja
Tidszonsförskjutningsmedveten och bevarande Ja
sommartidsmedveten Nej
Angiven skala Resultat (precision, skala) Kolumnlängd (byte) Precision för bråksekunder
datetimeoffset (34, 7) 10 7
datetimeoffset(0) (26, 0) 8 0 till 2
datetimeoffset(1) (28, 1) 8 0 till 2
datetimeoffset(2) (29, 2) 8 0 till 2
datetimeoffset(3) (30, 3) 9 3 till 4
datetimeoffset(4) (31, 4) 9 3 till 4
datetimeoffset(5) (32, 5) 10 5 till 7
datetimeoffset(6) (33, 6) 10 5 till 7
datetimeoffset(7) (34, 7) 10 5 till 7

Strängliterala format som stöds för datetimeoffset

I följande tabell visas de ISO 8601-strängliteralformat som stöds för datetimeoffset. Information om alfabetisk, numerisk, oparerad och tidsformat för datum- och tidsdelarna för datetimeoffset finns i datum (Transact-SQL) och tid (Transact-SQL).

ISO 8601 Beskrivning
åååå-MM-ddTHH:mm:ss[.nnnnnnn][{+|-}hh:mm] De här två formaten påverkas inte av inställningarna för sessionsspråket SET LANGUAGE och SET DATEFORMAT sessionsspråket. Blanksteg tillåts inte mellan datetimeoffset och datetime-delarna .
åååå-MM-ddTHH:mm:ss[.nnnnnn]Z (UTC) Det här formatet efter ISO-definition anger att datetime-delen ska uttryckas i Coordinated Universal Time (UTC). Till exempel 1999-12-12 12:30:30.12345 -07:00 bör representeras som 1999-12-12 19:30:30.12345Z.

I följande exempel jämförs resultatet av gjutning av en sträng med varje datum och tid datatyp.

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

Här är resultatet.

Datatyp Utgång
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

Tidszonsförskjutning

En tidszonsförskjutning anger zonförskjutningen från UTC för ett tids - eller datetime-värde . Tidszonsförskjutningen kan representeras som [+|-] hh:mm:

  • hh är två siffror som sträcker sig från 00 till 14 och representerar antalet timmar i tidszonsförskjutningen.

  • mm är två siffror, från 00 till 59, som representerar antalet ytterligare minuter i tidszonsförskjutningen.

  • + (plus) eller - (minus) är det obligatoriska tecknet för en tidszonsförskjutning. Det här tecknet anger om tidszonsförskjutningen läggs till eller subtraheras från UTC-tiden för att hämta den lokala tiden. Det giltiga intervallet för tidszonsförskjutning är från -14:00 till +14:00.

Tidszonens förskjutningsintervall följer W3C XML-standarden för XSD-schemadefinitionen och skiljer sig något från SQL 2003-standarddefinitionen 12:59 till +14:00.

Den valfria parameterparameterns precision för bråksekunder anger antalet siffror för bråkdelen av sekunderna. Det här värdet kan vara ett heltal med 0 till 7 (100 nanosekunder). Standardprecisionen för bråksekunder är 100 ns (sju siffror för bråkdelen av sekunderna).

Data lagras i databasen och bearbetas, jämförs, sorteras och indexeras på servern som i UTC. Tidszonsförskjutningen bevaras i databasen för hämtning.

Den angivna tidszonsförskjutningen antas vara medveten om sommartid (DST) och justerad för varje given datetime som är under DST-perioden.

För datetimeoffset-typen verifierasdatetime-värdet för både UTC och lokalt (till den beständiga eller konverterade tidszonsförskjutningen) under åtgärderna insert, update, aritmetic, convert eller assign. Identifieringen av ogiltiga UTC-värden eller lokala (till den beständiga eller konverterade tidszonsförskjutningen ) genererar ett ogiltigt värdefel. Är till exempel 9999-12-31 10:10:00 giltigt i UTC, men flödar över i lokal tid till tidszonsförskjutningen +13:50.

Syntax för tidszonskonvertering

SQL Server 2016 (13.x) introducerade syntaxen AT TIME ZONE för att underlätta sommartidsmedvetna, universella tidszonskonverteringar. Den här syntaxen är särskilt användbar när du konverterar data utan tidszonsförskjutningar till data med tidszonsförskjutningar. Information om hur du konverterar till motsvarande datetimeoffset-värde i en måltidszon finns i AT TIME ZONE (AT TIME ZONE).

ANSI- och ISO 8601-efterlevnad

Avsnitten ANSI och ISO 8601 efterlevnad i datum - och tidsartiklarna gäller för datetimeoffset.

Bakåtkompatibilitet för klienter på nednivå

Vissa klienter på nednivå stöder inte datatyperna tid, datum, datetime2 och datetimeoffset . I följande tabell visas typmappningen mellan en instans på hög nivå av SQL Server och klienter på nednivå.

SQL Server-datatyp Standardformat för strängliteral som skickas till klient på nednivå Odbc på nednivå OLEDB på nednivå JDBC på nednivå SQLCLIENT på nednivå
tid HH:mm:ss[.nnnnnnn] SQL_WVARCHAR eller SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String eller SqString
datum åååå-MM-dd SQL_WVARCHAR eller SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String eller SqString
datetime2 åååå-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR eller SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String eller SqString
datetimeoffset åååå-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR eller SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String eller SqString

Support för Microsoft Fabric

I Microsoft Fabric kan du för närvarande inte skapa kolumner med datatypen datetimeoffset , men du kan använda datetimeoffset för att konvertera data med funktionen AT TIME ZONE (Transact-SQL) till exempel:

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

I Microsoft Fabric SQL-databasen: Precisionen på 7 siffror kan användas, men speglade data i Fabric OneLake skulle få tidszonen och sjunde gången decimaler trimmade. Den här kolumntypen kan inte användas som primärnyckel i tabeller i Fabric SQL Database.

Konvertera datum- och tidsdata

När du konverterar till datatyper för datum och tid avvisar SQL Server alla värden som inte kan identifieras som datum eller tider. Information om hur du använder funktionerna CAST och CONVERT med datum- och tidsdata finns i CAST- och CONVERT-.

Konvertera till datatypen datetimeoffset

Det här avsnittet innehåller ett exempel på hur du uppdaterar data från en datatyp utan förskjutningar till en ny datatypskolumn för datetimeoffset .

Kontrollera först tidszonsnamnet från vyn sys.time_zone_info systemkatalog.

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

I följande exempel används syntaxen AT TIME ZONE två gånger. Exempelkoden skapar en tabell dbo.Audit, lägger till data som sträcker sig över flera ändringar av sommartid och lägger till en ny datetimeoffset-kolumn . Vi antar att AuditCreated kolumnen är en *datetime2-datatyp utan förskjutningar och skrevs med hjälp av UTC-tidszonen.

I -instruktionen UPDATE lägger syntaxen AT TIME ZONE först till UTC-tidszonsförskjutning till befintliga AuditCreated kolumndata och konverterar sedan data från UTC till Pacific Standard Time, vilket justerar historiska data korrekt för varje tidigare tidsintervall för sommartid i 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 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;

Här är resultatet.

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

Konvertera datatypen datetimeoffset till andra datum- och tidstyper

I det här avsnittet beskrivs vad som händer när en datetimeoffset-datatyp konverteras till andra datatyper för datum och tid.

När du konverterar till datum kopieras året, månaden och dagen. Följande kod visar resultatet av att konvertera ett datetimeoffset(4) -värde till ett datumvärde .

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

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

Här är resultatet.

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

Om konverteringen är till time(n), kopieras timme, minut, sekund och bråksekunder. Tidszonsvärdet trunkeras. När precisionen för datetimeoffset(n) värdet är större än precisionen för värdet time(n) avrundas värdet uppåt. Följande kod visar resultatet av konverteringen av ett datetimeoffset(4)-värde till ett tidsvärde(3).

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

Här är resultatet.

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

När du konverterar till datetime kopieras datum- och tidsvärdena och tidszonen trunkeras. När bråkprecisionen för datetimeoffset(n) värdet är större än tre siffror trunkeras värdet. Följande kod visar resultatet av att konvertera ett datetimeoffset(4) -värde till ett datetime-värde .

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

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

Här är resultatet.

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

För konverteringar till smalldatetime kopieras datum och timmar. Minuterna avrundas uppåt med avseende på sekundernas värde och sekunderna är inställda på 0. Följande kod visar resultatet av att konvertera ett datetimeoffset(3) -värde till ett smalldatetime-värde .

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

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

Här är resultatet.

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

Om konverteringen är till datetime2(n) kopieras datum och tid till datetime2-värdet och tidszonen trunkeras. När precisionen för datetime2(n) -värdet är större än precisionen för datetimeoffset(n) -värdet trunkeras bråksekunderna så att de passar. Följande kod visar resultatet av konverteringen av ett datetimeoffset(4) -värde till ett datetime2(3) -värde.

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

Här är resultatet.

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

Konvertera strängliteraler till datetimeoffset

Konverteringar från strängliteraler till datum- och tidstyper tillåts om alla delar av strängarna är i giltiga format. Annars utlöses ett körningsfel. Implicita konverteringar eller explicita konverteringar som inte anger ett format, från datum- och tidstyper till strängliteraler är i standardformatet för den aktuella sessionen. I följande tabell visas reglerna för att konvertera en strängliteral till datatypen datetimeoffset .

Indatasträngliteral datetimeoffset(n)
ODBC DATE ODBC-stränglitaraler mappas till datatypen datetime . Tilldelningsåtgärder från ODBC DATETIME literaler till datetimeoffset-typer orsakar en implicit konvertering mellan datetime och den här typen, enligt definitionen i konverteringsreglerna.
ODBC TIME Se föregående ODBC DATE regel
ODBC DATETIME Se föregående ODBC DATE regel
DATE bara Delen TIME är 00:00:00som standard . Standardvärdena TIMEZONE för +00:00
TIME bara Delen DATE är 1900-1-1som standard . Standardvärdena TIMEZONE för +00:00
TIMEZONE bara Standardvärden anges
DATE + TIME Standardvärdena TIMEZONE för +00:00
DATE + TIMEZONE Tillåts inte
TIME + TIMEZONE DATE-delen är som standard 1900-1-1
DATE + TIME + TIMEZONE Trivial