sql >> Database >  >> RDS >> Sqlserver

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

Er zijn waarschijnlijk maar heel weinig gebruikssituaties die ertoe kunnen leiden dat u een datetime2 . converteert waarde tot datetime in SQL-server. In het bijzonder de datetime2 gegevenstype kan worden ingesteld om dezelfde opslaggrootte te gebruiken als datetime , maar met hogere precisie. Dus in de meeste gevallen ben je beter af met datetime2 dan met een datetime . Microsoft raadt ook aan om datetime2 . te gebruiken in plaats van datetime .

Als u zich echter in de situatie bevindt waarin u deze conversie moet uitvoeren, bevat dit artikel enkele voorbeelden en overwegingen die u kunnen helpen.

Wanneer u een datetime2 . converteert waarde tot datetime , hangt de resulterende waarde af van de fractionele seconden die zijn toegewezen aan de datetime2 waarde, evenals de precisie ervan.

De datetime2 Met het gegevenstype kunt u een precisie van een fractie van een seconde specificeren van 0 tot 7. Als u dit niet opgeeft, wordt 7 gebruikt (de standaard).

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.

Daarom, als de datetime2 een schaal van 3 gebruikt, zal de resulterende waarde zeer dicht (zo niet identiek) zijn aan de oorspronkelijke waarde. Vanwege de lagere nauwkeurigheid van datetime , de resultaten kunnen verschillen vanwege de afronding die het uitvoert.

Voorbeeld 1 – Impliciete conversie

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

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Resultaat:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 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 datetime2 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.

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 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Resultaat:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 |
+-----------------------------+-------------------------+

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

Het is belangrijk op te merken dat dit nog steeds waar zal zijn, zelfs als we slechts 3 fractionele seconden toewijzen aan de datetime2 waarde.

Voorbeeld:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.125';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Resultaat:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Het loont ook om op de hoogte te zijn van eventuele afrondingen op de oorspronkelijke datetime2 waarde. De datetime2 waarde kan zelf naar boven worden afgerond als we proberen een waarde toe te kennen met meer fractionele seconden dan zijn eigen schaal.

Voorbeeld:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Resultaat:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

In dit geval probeer ik een waarde toe te kennen met een fractioneel deel van 1256789 . Echter, omdat de datetime2(3) waarde heeft alleen een schaal van 3, kan slechts 3 decimalen ondersteunen, en in dit geval wordt het laatste cijfer naar boven afgerond (omdat het volgende cijfer 5 of hoger is).

Beide datetime2(3) en datetime dezelfde hoeveelheid opslagruimte gebruiken (8 bytes). De datetime2(3) gegevenstype gebruikt eigenlijk 7 bytes om de gegevens op te slaan, maar 1 extra byte om de precisie op te slaan.

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

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

Resultaat:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 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 @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetime, @thedatetime2) AS 'datetime';

Resultaat:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

  1. Hoe Sind() werkt in PostgreSQL

  2. cross-app xml-query presteert exponentieel slechter naarmate xml-document groeit

  3. Hoe werkt Subquery in select-instructie in Oracle?

  4. Verkrijg de korte dagnaam in PostgreSQL