Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Warehouse i Microsoft Fabric
SQL-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 0001 9999 , 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ån00
till14
och representerar antalet timmar i tidszonsförskjutningen.mm
är två siffror, från00
till59
, 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:00 som standard . Standardvärdena TIMEZONE för +00:00 |
TIME bara |
Delen DATE är 1900-1-1 som 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 |