sql >> Database >  >> RDS >> Sqlserver

Converteer 'datetime2' naar 'datetimeoffset' in SQL Server (T-SQL-voorbeelden)

Dit artikel bevat voorbeelden van het converteren van een datetime2 waarde naar een datetimeoffset waarde in SQL Server.

Wanneer u een datetime2 . converteert waarde naar datetimeoffset , hangt de resulterende waarde af van de fractionele secondennauwkeurigheid die aan elk gegevenstype is toegewezen, evenals de tijdzoneverschuiving die u opgeeft.

Met beide gegevenstypen kunt u een precisie van een fractie van een seconde specificeren van 0 tot 7. Als u dit niet opgeeft, wordt de standaardschaal van 7 gebruikt.

De datetimeoffset gegevenstype bevat een tijdzoneverschuiving en kan eventuele verschuivingen in de oorspronkelijke waarde behouden. Echter, datetime2 heeft geen tijdzonebewustzijn, dus er zijn geen bestaande waarden om te behouden. In dit geval wordt de tijdzone-offset standaard ingesteld op +00:00.

De TODATETIMEOFFSET() functie is speciaal ontworpen om een ​​datum/tijd-waarde om te zetten in datetimeoffset en voeg een tijdzone-offset toe. Zie echter mijn opmerkingen (en voorbeelden) hieronder met betrekking tot deze optie.

Voorbeeld 1 – Impliciete conversie

Ten eerste is hier een voorbeeld van een impliciete conversie tussen datetime2 en datetimeoffset .

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Resultaat:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Dit is een impliciete conversie omdat we geen conversiefunctie (zoals hieronder) gebruiken om deze expliciet te converteren. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de datetime2 toe te wijzen waarde naar een datetimeoffset variabel.

We kunnen zien dat de datetimeoffset variabele kan dezelfde precisie gebruiken als de datetime2 waarde (7 decimalen). We eindigen ook met een tijdzoneverschuiving van +00:00 .

Het gebruik van 7 fractionele seconden precisie veroorzaakt datetimeoffset om 11 bytes te gebruiken voor opslag (10 voor de gegevens en 1 byte voor de precisie). De datetime2 type gebruikt 9 bytes (8 voor de gegevens en 1 byte voor de precisie) bij gebruik van een schaal van 7.

U kunt de nauwkeurigheid echter verminderen door de 7 te vervangen door een lager getal.

Voorbeeld 2 – Afronding

Als datetimeoffset heeft een lagere precisie dan de datetime2 waarde, wordt deze naar boven afgerond.

Hier is een voorbeeld:

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(6);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2(7)',
  @thedatetimeoffset AS 'datetimeoffset(6)';

Resultaat:

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

In dit voorbeeld is de datetime2 waarde heeft een schaal van 7 maar de datetimeoffset de schaal van de waarde is slechts 6. Daarom is de precisie slechts tot 6 cijfers achter de komma en wordt het zesde cijfer naar boven afgerond op 7 (in plaats van 6).

Voorbeeld 3 – Expliciete conversie met CAST()

Hier is een voorbeeld van een expliciete conversie. In dit geval gebruik ik de CAST() functie direct binnen de SELECT statement om expliciet te converteren tussen datetime2 en datetimeoffset .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetimeoffset) AS 'datetimeoffset';

Resultaat:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Voorbeeld 4 – Expliciete conversie met CONVERT()

Hier is een voorbeeld van een expliciete conversie met de CONVERT() functie in plaats van CAST() .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetimeoffset, @thedatetime2) AS 'datetimeoffset';

Resultaat:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Voorbeeld 5 – De tijdzone-offset wijzigen

Als u converteert vanaf datetime2 naar datetimeoffset , je doet het waarschijnlijk voor de tijdzone-offset. Het is ook zeer waarschijnlijk dat u een andere waarde nodig heeft dan de standaardwaarde +00:00.

Gelukkig kun je de TODATETIMEOFFSET() . gebruiken functie om de offset te wijzigen.

U kunt deze functie ook gebruiken om de originele datetime2 . te converteren waarde naar een datetimeoffset waarde. Deze functie accepteert elke datum/tijd-waarde die kan worden omgezet in een datetime2 waarde en een offsetwaarde.

Hier is een voorbeeld:

DECLARE @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime2, '+07:00');
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset';

Resultaat:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

En hier is een voorbeeld van het gebruik van de functie binnen de SELECT verklaring:

DECLARE @thedatetime2 datetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  TODATETIMEOFFSET(@thedatetime2, '+07:00') AS 'datetimeoffset';

Resultaat:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Een belangrijk punt over de TODATETIMEOFFSET() functie is dat het dezelfde fractionele precisie gebruikt als het datum/tijd-argument dat eraan wordt doorgegeven.

Daarom, als uw datetime2 gebruikt een lagere precisie dan de datetimeoffset , kunt u het altijd met een hogere precisie opnieuw toewijzen aan een variabele en vervolgens die geconverteerde waarde doorgeven aan TODATETIMEOFFSET() .

Voorbeeld:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Resultaat (met verticale uitvoer):

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00

  1. Word lid van het Q&A-forum voor ontwikkelaars

  2. HAProxy:alle bronnen van de verschillende bronnen

  3. Meerdere manieren om duplicaten uit SQL-tabellen te verwijderen

  4. Queryresultaten retourneren als een door komma's gescheiden lijst in PostgreSQL