sql >> Database >  >> RDS >> Sqlserver

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

Dit artikel bevat voorbeelden van het converteren van een datetime waarde toe aan een datetime2 waarde in SQL Server.

Wanneer u een datetime . converteert waarde tot datetime2 , hangt de resulterende waarde af van de precisie van breuken in seconden die u toewijst aan datetime2 .

De datetime gegevenstype heeft een maximum van 3 cijfers voor het gedeelte met breuken in seconden. De nauwkeurigheid wordt afgerond op stappen van .000, .003 of .007 seconden.

De datetime2 Met het gegevenstype daarentegen 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).

Voorbeeld 1 – Impliciete conversie

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

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

Resultaat:

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

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

We kunnen zien dat de datetime2 variabele heeft meer fractionele seconden precisie, en we eindigen met een fractioneel deel van 1233333 (vs 123 voor de datetime waarde).

Voorbeeld 2 – 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. Zoals je zou verwachten, kan dit voor veel verwarring zorgen als je niet weet hoe het werkt. Het kan niet alleen verwarring veroorzaken bij het gebruik van datetime op zichzelf kan het extra verwarring veroorzaken bij het converteren van die waarde naar een ander gegevenstype.

Hier is een voorbeeld dat laat zien wat ik bedoel.

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

Resultaat:

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

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

De datetime2 waarde, stel de fractionele seconden echter in op 1266667 .

Trouwens, als we de beginwaarde gewoon hadden ingesteld op datetime2 in de eerste plaats zou het fractionele deel ervan 1250000 hebben geretourneerd .

Voorbeeld 3 – Precisie/nauwkeurigheid

Een van de voordelen van datetime2 is dat u hiermee de precisie van de fractionele seconden kunt specificeren. Als u dit niet doet, gebruikt het 7 (daarom gebruikt het vorige voorbeeld 7).

We kunnen daarom het vorige voorbeeld wijzigen zodat de datetime2 waarde gebruikt dezelfde fractionele seconden precisie als de datetime gegevenstype.

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

Resultaat:

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

Wanneer we dit doen, wordt de datetime2 waarde geeft hetzelfde resultaat als de datetime waarde. Het gebruikt ook dezelfde hoeveelheid opslagruimte (8 bytes). In dit geval datetime2 gebruikt 7 bytes om de waarde op te slaan en 1 byte om de precisie van de waarde op te slaan.

U kunt zelfs minder opgeven fractionele seconden precisie dan datetime als u geen behoefte heeft aan extra precisie. Als u dit doet, bespaart u een hele byte aan opslagruimte (uw datetime2 waarde zal 7 bytes gebruiken, vergeleken met 8 bytes voor de datetime waarde).

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

Resultaat:

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

Houd er rekening mee dat dit er ook toe kan leiden dat fracties van seconden worden afgerond.

Voorbeeld 4 – 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 datetime en datetime2 .

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

Resultaat:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Voorbeeld 5 – Expliciete conversie met CONVERT()

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

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

Resultaat:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Aanbeveling van Microsoft

Microsoft raadt aan om expliciet casten te gebruiken wanneer er een gemengd vergelijkingsscenario bestaat tussen deze twee gegevenstypen:

Onder databasecompatibiliteitsniveau 130, impliciete conversies van datetime naar datetime2 gegevenstypen tonen verbeterde nauwkeurigheid door rekening te houden met de fractionele milliseconden, wat resulteert in verschillende geconverteerde waarden... Gebruik expliciet casten naar datetime2 datatype wanneer een gemengd vergelijkingsscenario tussen datetime en datetime2 datatypes bestaat.


  1. Hoe video-inhoud op te slaan in de SQLite-database (niet het videopad)

  2. Converteer DateTime voor MySQL met C#

  3. Hoe de sortering van een kolom in MySQL te tonen

  4. PHP date() formaat bij het invoegen in datetime in MySQL