Delen via


datetimeoffset (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Definieert een datum die wordt gecombineerd met een tijd van een dag op basis van een 24-uurs klok zoals datum/tijd2 en voegt tijdzonebewustzijn toe op basis van Coordinated Universal Time (UTC).

beschrijving van datetimeoffset

Property Value
Syntax DATETIMEOFFSET [ ( fractionele seconden precisie ) ]
Usage DECLARE @MyDatetimeoffset DATETIMEOFFSET(7);
CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7));
standaardtekenreeks letterlijke notaties (gebruikt voor client op down-level) jjjj-MM-dd HH:mm:ss[.nnnnnnn] [{+|-}hh:mm]

Zie de sectie Achterwaartse compatibiliteit voor clients op lager niveau die volgt voor meer informatie.
Datumbereik 0001-01-01 tot en met 9999-12-31

1 januari 1 CE tot en met 31 december 9999 CE
Tijdsbereik 00:00:00 tot en met 23:59:59.9999999
tijdzoneverschilbereik -14:00 tot en met +14:00
Elementbereiken yyyy is vier cijfers, variërend van 0001 tot 9999en met , die een jaar vertegenwoordigen.

MM is twee cijfers, variërend van 01 tot 12, die een maand in het opgegeven jaar vertegenwoordigen.
dd is twee cijfers, variërend van 01 tot 31 , afhankelijk van de maand, die een dag van de opgegeven maand vertegenwoordigen.
HH is twee cijfers, variërend van 00 tot 23, die het uur vertegenwoordigen.
mm is twee cijfers, variërend van 00 tot 59, die de minuut vertegenwoordigen.
ss is twee cijfers, variërend van 00 tot 59, die de tweede vertegenwoordigen.
n is nul tot zeven cijfers, variërend van 0 tot 9999999, die de fractionele seconden vertegenwoordigen.
hh is twee cijfers die variëren van -14 tot +14.
mm is twee cijfers die variëren van 00 tot 59.
Tekenlengte 26 posities minimaal (jjjj-MM-dd HH:mm:ss {+|-}uu:mm) tot maximaal 34 (jjjj-MM-dd HH:mm:ss.nnnnnn {+|-}hh:mm:mm)
Precisie, schaal Zie de onderstaande tabel.
Opslaggrootte 10 bytes, vast is de standaardwaarde met de standaardwaarde van 100-ns fractionele seconde precisie.
Accuracy 100 nanoseconden
Standaardwaarde 1900-01-01 00:00:00 00:00
Calendar Gregorian
door de gebruiker gedefinieerde tweede precisie Yes
tijdzone-offsetbewust en behoud Yes
zomertijdbewuste No
Opgegeven schaal Resultaat (precisie, schaal) Kolomlengte (bytes) Precisie van breuken seconden
datetimeoffset (34, 7) 10 7
datetimeoffset(0) (26, 0) 8 0 tot 2
datetimeoffset(1) (28, 1) 8 0 tot 2
datetimeoffset(2) (29, 2) 8 0 tot 2
datetimeoffset(3) (30, 3) 9 3 tot 4
datetimeoffset(4) (31, 4) 9 3 tot 4
datetimeoffset(5) (32, 5) 10 5 tot 7
datetimeoffset(6) (33, 6) 10 5 tot 7
datetimeoffset(7) (34, 7) 10 5 tot 7

Ondersteunde letterlijke tekenreeksindelingen voor datetimeoffset

De volgende tabel bevat de ondersteunde letterlijke iso 8601-tekenreeksindelingen voor datetimeoffset. Zie datum en tijd voor informatie over alfabetische, numerieke, niet-patuur- en tijdnotaties voor de datum- en tijdonderdelen van datetimeoffset.

ISO 8601 Description
yyyy-MM-ddTHH:mm:ss[.nnnnnnn][{+|-}hh:mm] Deze twee indelingen worden niet beïnvloed door de instellingen voor de landinstellingen van de SET LANGUAGE sessie SET DATEFORMAT . Spaties zijn niet toegestaan tussen de datum/tijd-offset en de datum/tijd-onderdelen .
jjjj-MM-ddTHH:mm:ss[.nnnnnnn]Z (UTC) Deze indeling volgens ISO-definitie geeft aan dat het datum/tijd-gedeelte moet worden uitgedrukt in Coordinated Universal Time (UTC). Moet bijvoorbeeld 1999-12-12 12:30:30.12345 -07:00 worden weergegeven als 1999-12-12 19:30:30.12345Z.

In het volgende voorbeeld worden de resultaten van het casten van een tekenreeks vergeleken met elke datum en tijd gegevenstype.

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

Hier is het resultatenoverzicht.

Gegevenstype 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

Tijdzoneverschil

Een tijdzone-offset geeft de zone-offset van UTC op voor een tijd - of datum/tijd-waarde . De tijdzone-verschuiving kan worden weergegeven als [+|-] uu:mm:

  • hh is twee cijfers die variëren van 00 tot 14 en vertegenwoordigen het aantal uren in de tijdzone-offset.

  • mm is twee cijfers, variërend van 00 tot 59, die het aantal extra minuten in de tijdzone-offset vertegenwoordigen.

  • + (plus) of - (min) is het verplichte teken voor een tijdzoneverschil. Dit teken geeft aan of de tijdzone-offset wordt toegevoegd of afgetrokken van de UTC-tijd om de lokale tijd te verkrijgen. Het geldige tijdzoneverschil is van -14:00 tot +14:00.

Het tijdzoneverschilbereik volgt de W3C XML-standaard voor XSD-schemadefinitie en verschilt enigszins van de standaarddefinitie van SQL 2003 tot 12:59+14:00.

De precisie van de optionele typeparameter fractionele seconden geeft het aantal cijfers voor het fractionele deel van de seconden aan. Deze waarde kan een geheel getal zijn met 0 tot 7 (100 nanoseconden). De standaardprecisie van fractionele seconden is 100 ns (zeven cijfers voor het breukgedeelte van de seconden).

De gegevens worden opgeslagen in de database en verwerkt, vergeleken, gesorteerd en geïndexeerd op de server, zoals in UTC. De tijdzone-offset blijft behouden in de database voor het ophalen.

Bij de opgegeven tijdzone-offset wordt ervan uitgegaan dat de zomertijd (DST) op de hoogte is en wordt aangepast voor een bepaalde datum/tijd die zich in de DST-periode bevindt.

Voor het type datetimeoffset worden zowel UTC als lokaal (naar de permanente of geconverteerde tijdzone-offset) datum/ tijd gevalideerd tijdens het invoegen, bijwerken, berekenen, converteren of toewijzen van bewerkingen. De detectie van een ongeldige UTC- of lokale waarde (naar de permanente of geconverteerde tijdzone-offset) veroorzaakt een ongeldige waardefout. Is bijvoorbeeld 9999-12-31 10:10:00 geldig in UTC, maar loopt over in de lokale tijd naar de tijdzone-offset +13:50.

Syntaxis voor tijdzoneconversie

SQL Server 2016 (13.x) heeft de AT TIME ZONE syntaxis geïntroduceerd om zomertijdbewuste, universele tijdzoneconversies mogelijk te maken. Deze syntaxis is vooral handig bij het converteren van gegevens zonder tijdzone-offsets naar gegevens met tijdzone-offsets. Als u wilt converteren naar een bijbehorende datum/tijdoffset-waarde in een doeltijdzone, raadpleegt u AT TIME ZONE.

ANSI- en ISO 8601-naleving

De ANSI- en ISO 8601-nalevingssecties van de artikelen over datum en tijd zijn van toepassing op datetimeoffset.

Compatibiliteit met eerdere versies voor clients met een lager niveau

Sommige downlevel clients bieden geen ondersteuning voor de gegevenstypen tijd, datum, datum/tijd2 en datetimeoffset . In de volgende tabel ziet u de typetoewijzing tussen een exemplaar op hoger niveau van SQL Server en clients op een lager niveau.

SQL Server-gegevenstype Standaardtekenreeks letterlijke notatie doorgegeven aan client op down-level ODBC op lager niveau OLEDB op lager niveau Down-level JDBC Down-level SQLCLIENT
time HH:mm:ss[.nnnnnnn] SQL_WVARCHAR of SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String of SqString
date yyyy-MM-dd SQL_WVARCHAR of SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String of SqString
datetime2 jjjj-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR of SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String of SqString
datetimeoffset jjjj-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR of SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String of SqString

Ondersteuning voor Microsoft Fabric

In Microsoft Fabric kunt u momenteel geen kolommen maken met het gegevenstype datetimeoffset , maar u kunt datetimeoffset gebruiken voor het converteren van gegevens met de functie AT TIME ZONE , bijvoorbeeld:

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

In Microsoft Fabric SQL-database: precisie van 7 cijfers kan worden gebruikt, maar gespiegelde gegevens in Fabric OneLake zouden de tijdzone en de zevende tijdsdecimaal zijn ingekort. Dit kolomtype kan niet worden gebruikt als primaire sleutel in tabellen in de Fabric SQL-database.

Datum- en tijdgegevens converteren

Wanneer u converteert naar datum- en tijdgegevenstypen, weigert SQL Server alle waarden die niet als datums of tijden kunnen worden herkend. Zie CASTvoor informatie over het gebruik van de functies CONVERT en met datum- en tijdgegevens.

Converteren naar gegevenstype datetimeoffset

Deze sectie bevat een voorbeeld van het bijwerken van gegevens van een gegevenstype zonder verschuivingen naar een nieuwe kolom met het gegevenstype datetimeoffset .

Controleer eerst de tijdzonenaam in de sys.time_zone_info systeemcatalogusweergave.

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

In het volgende voorbeeld wordt de syntaxis VAN DE AT TIME ZONE tweemaal gebruikt. De voorbeeldcode maakt een tabel dbo.Audit, voegt gegevens toe die meerdere zomertijdwijzigingen omvatten en voegt een nieuwe datetimeoffset-kolom toe. We gaan ervan uit dat de AuditCreated kolom een *datum/tijd2-gegevenstype is zonder offsets en is geschreven met behulp van de UTC-tijdzone.

In de UPDATE instructie voegt de AT TIME ZONE syntaxis eerst UTC-tijdzoneverschil toe aan de bestaande AuditCreated kolomgegevens en converteert vervolgens de gegevens van UTC naar Pacific Standard Time, waarbij de historische gegevens voor elk afgelopen zomertijdbereik in de Verenigde Staten correct worden aangepast.

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;

Hier is het resultatenoverzicht.

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

Het gegevenstype datetimeoffset converteren naar andere datum- en tijdtypen

In deze sectie wordt beschreven wat er gebeurt wanneer een datum/tijd-gegevenstype wordt geconverteerd naar andere datum- en tijdgegevenstypen.

Wanneer u converteert naar datum, worden het jaar, de maand en de dag gekopieerd. De volgende code toont de resultaten van het converteren van een datetimeoffset(4) waarde naar een datumwaarde .

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

Hier is het resultatenoverzicht.

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

Als de conversie naar tijd(n) is, worden het uur, de minuut, de seconde en de fractionele seconden gekopieerd. De tijdzonewaarde wordt afgekapt. Wanneer de precisie van de waarde datetimeoffset(n) groter is dan de precisie van de tijd(n) waarde, wordt de waarde naar boven afgerond. De volgende code toont de resultaten van het converteren van een datetimeoffset(4) waarde naar een tijd(3) waarde.

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

Hier is het resultatenoverzicht.

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

Wanneer u converteert naar datum/tijd, worden de datum- en tijdwaarden gekopieerd en wordt de tijdzone afgekapt. Wanneer de breuknauwkeurigheid van de datetimeoffset(n) waarde groter is dan drie cijfers, wordt de waarde afgekapt. De volgende code toont de resultaten van het converteren van een datetimeoffset(4) -waarde naar een datum/tijd-waarde .

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

Hier is het resultatenoverzicht.

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

Voor conversies naar smalldatetime worden de datum en uren gekopieerd. De minuten worden afgerond met betrekking tot de waarde van de seconden en seconden zijn ingesteld op 0. De volgende code toont de resultaten van het converteren van een datetimeoffset(3) waarde naar een smalldatetime-waarde .

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

Hier is het resultatenoverzicht.

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

Als de conversie is naar datetime2(n), worden de datum en tijd gekopieerd naar de datum/tijd-waarde en wordt de tijdzone afgekapt. Wanneer de precisie van de datum/tijd2(n) waarde groter is dan de precisie van de datum/tijdoffset(n), worden de fractionele seconden afgekapt zodat deze passen. De volgende code toont de resultaten van het converteren van een datetimeoffset(4) waarde naar een datetime2(3) waarde.

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

Hier is het resultatenoverzicht.

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

Letterlijke tekenreeksen converteren naar datetimeoffset

Conversies van letterlijke tekenreeksen tot datum- en tijdtypen zijn toegestaan als alle delen van de tekenreeksen geldige notaties hebben. Anders wordt er een runtimefout gegenereerd. Impliciete conversies of expliciete conversies die geen stijl opgeven, van datum- en tijdtypen tot letterlijke tekenreeksen hebben de standaardindeling van de huidige sessie. In de volgende tabel ziet u de regels voor het converteren van een letterlijke tekenreeks naar het gegevenstype datetimeoffset .

Letterlijke invoertekenreeks datetimeoffset(n)
ODBC DATE Letterlijke odbc-tekenreeksen worden toegewezen aan het gegevenstype datum/tijd . Elke toewijzingsbewerking van ODBC DATETIME letterlijke gegevens naar typen datetimeoffset veroorzaakt een impliciete conversie tussen datum/tijd en dit type, zoals gedefinieerd door de conversieregels.
ODBC TIME ODBC DATE Vorige regel weergeven
ODBC DATETIME ODBC DATE Vorige regel weergeven
DATE alleen Het TIME onderdeel wordt standaard ingesteld op 00:00:00. De TIMEZONE standaardwaarde is +00:00
TIME alleen Het DATE onderdeel wordt standaard ingesteld op 1900-1-1. De TIMEZONE standaardwaarde is +00:00
TIMEZONE alleen Standaardwaarden worden opgegeven
DATE + TIME De TIMEZONE standaardwaarde is +00:00
DATE + TIMEZONE Niet toegestaan
TIME + TIMEZONE Het DATE onderdeel wordt standaard ingesteld op 1900-1-1
DATE + TIME + TIMEZONE Trivial