sql >> Database >  >> RDS >> Sqlserver

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

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

Wanneer u een datetimeoffset . converteert waarde tot datetime , worden de datum- en tijdwaarden gekopieerd en wordt de tijdzone-offset ingekort. Wanneer de fractionele precisie van de datetimeoffset waarde groter is dan drie cijfers, wordt de waarde afgekapt.

De datetimeoffset gegevenstype stelt u in staat om een ​​precisie van een fractie van een seconde van 0 tot 7 te specificeren. Dit wordt gedaan 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. Een andere byte wordt gebruikt om de precisie op te slaan, dus dit voegt 1 byte toe aan die cijfers.

De datetime gegevenstype daarentegen heeft een maximum van 3 cijfers voor het fractionele secondengedeelte. De nauwkeurigheid wordt afgerond op stappen van .000, .003 of .007 seconden. Dit gegevenstype heeft geen tijdzonebewustzijn en daarom geen tijdzoneverschuiving. De opslaggrootte is 8 bytes.

Voorbeeld 1 – Impliciete conversie

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

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

Resultaat:

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

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 naar een datetime variabel.

We kunnen zien dat de datetime variabele heeft minder fractionele seconden precisie, en we eindigen met een fractioneel deel van 123 ook al was het originele fractionele deel 1234567 .

In dit geval is er geen afronding uitgevoerd.

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

In deze conversie is de opslaggrootte afgenomen van 10 bytes (11 bytes als je de extra byte opneemt die de precisie opslaat) voor datetimeoffset , tot 8 bytes voor datetime . Als de datetimeoffset waarde een schaal tussen 0 en 2 had gebruikt, zou het slechts 8 bytes hebben gebruikt (9 inclusief precisie).

Als het een schaal van 3 had gebruikt (het equivalent van de datetime waarde), zou de opslaggrootte 9 bytes zijn geweest (10 met precisie). De nauwkeurigheid zou echter hoger zijn geweest dan datetime . De nauwkeurigheid zou natuurlijk afnemen zodra we deze hebben omgezet naar datetime .

Voorbeeld 2 – Precisie/nauwkeurigheid en afronding

De datetime gegevenstype wordt afgerond op stappen van .000, .003 of .007 seconden. Zelfs als u het expliciet op een andere waarde instelt, wordt het afgerond.

Dit geldt ook bij het converteren van een ander gegevenstype (zoals wat we hier doen).

Hier is een voorbeeld dat laat zien wat ik bedoel.

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedatetime datetime;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1250000 +07:00';
SET @thedatetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime AS 'datetime';

Resultaat:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime                |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |
+------------------------------------+-------------------------+

In dit voorbeeld stel ik de fractionele seconden in van de datetimeoffset waarde tot 1250000 maar datetime afgerond op 127 (omdat het alleen kan worden afgerond op stappen van .000, .003 of .007 seconden).

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 datetime .

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

Resultaat:

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

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(datetime, @thedatetimeoffset) AS 'datetime';

Resultaat:

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

  1. TWEEDE() Voorbeeld – MySQL

  2. Dapper gebruiken met Oracle-opgeslagen procedures die cursors retourneren

  3. SSL voor PostgreSQL-verbindingsknooppunten

  4. Overeenkomen met alle waarden in de IN-clausule