sql >> Database >  >> RDS >> Sqlserver

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

Dit artikel bevat voorbeelden van het converteren van een datetimeoffset waarde tot datetime2 in SQL-server.

Wanneer u een datetimeoffset . converteert waarde tot datetime2 , worden de datum en tijd gekopieerd naar de datetime2 waarde, en de tijdzone wordt afgekapt. De fractionele seconden worden ook afgekapt om te passen als de bestemmingsprecisie lager is.

De datetimeoffset gegevenstype stelt u in staat om een ​​precisie van een fractie van een seconde van 0 tot 7 op te geven met behulp van de datetimeoffset(n) syntaxis. Als u dit niet opgeeft, wordt 7 gebruikt (de standaardinstelling). Het heeft ook een tijdzone-offset. De opslaggrootte van dit gegevenstype is 8, 9 of 10 bytes, afhankelijk van de nauwkeurigheid die wordt gebruikt.

De datetime2 Met het gegevenstype kunt u ook een precisie van een fractie van een seconde specificeren van 0 tot 7 (met behulp van de datetime2(n) syntaxis). Het heeft geen tijdzonebewustzijn. De opslaggrootte is 6, 7 of 8, afhankelijk van de precisie die wordt gebruikt.

Houd er rekening mee dat de hier vermelde opslagbedragen de bedragen zijn die worden vermeld in de Microsoft-documentatie. Deze gegevenstypen gebruiken echter ook 1 byte om de precisie op te slaan. Voeg daarom 1 byte toe aan de hier vermelde hoeveelheden voor een vollediger beeld van de opslagvereisten.

Voorbeeld 1 – Impliciete conversie

Hier is een voorbeeld van een impliciete conversie tussen datetimeoffset en datetime2 .

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

Resultaat:

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

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 datetimeoffset toe te wijzen waarde toe aan een datetime2 variabel.

In dit voorbeeld gebruiken beide gegevenstypen de standaardprecisie (7 decimalen). Daarom was het fractionele deel 1234567 voor beide resultaten.

We zien ook dat de tijdzone-offset is afgekapt - de datetime2 gegevenstype heeft geen tijdzonebewustzijn.

In deze conversie is de opslaggrootte afgenomen van 10 bytes (voor datetimeoffset ) tot 8 bytes (voor datetime2 ), maar merk op dat er 1 byte wordt toegevoegd om de precisie op te slaan.

Voorbeeld 2 – Verschillende precisie

Hier is een voorbeeld dat laat zien wat er gebeurt als de datetime2 waarde gebruikt een lagere precisie voor de datetimeoffset waarde.

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

Resultaat:

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

In dit voorbeeld is de datetimeoffset heeft een schaal van 7 maar de datetime2 waarde heeft een schaal van slechts 3 . Daarom zijn de fractionele seconden afgekapt om te passen.

Houd er rekening mee dat hierdoor afronding kan optreden. Hier is een voorbeeld waarbij het fractionele deel van de datetime2 waarde wordt naar boven afgerond op 124 .

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

Resultaat:

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

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 datetimeoffset en datetime2 .

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

Resultaat:

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

Voorbeeld 4 – Expliciete conversie met CONVERT()

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

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

Resultaat:

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

  1. Waarom de Optimizer geen kennis van bufferpools gebruikt?

  2. MariaDB CURRENT_ROLE() uitgelegd

  3. Postgres faalt met 'kon relatietoewijzingsbestand global/pg_filenode.map niet openen'

  4. Hoe maak je een tabel met meerdere buitenlandse sleutels en raak je niet in de war?