sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera 'datetime' till 'datetime2' i SQL Server (T-SQL-exempel)

Den här artikeln innehåller exempel på hur du konverterar en datumtid värde till en datetime2 värde i SQL Server.

När du konverterar en datumtid värde till datetime2 , kommer det resulterande värdet att bero på bråksekundersprecisionen som du tilldelar datetime2 .

datetime datatypen har högst 3 siffror för sin del av bråkdelssekunder. Dess noggrannhet är avrundad till steg om 0,000, 0,003 eller 0,007 sekunder.

datetime2 datatyp, å andra sidan, låter dig ange en bråkdelssekunderprecision från 0 till 7. Om du inte anger detta kommer den att använda 7 (standard).

Exempel 1 – Implicit konvertering

Här är ett exempel på en implicit konvertering mellan datetime och 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';

Resultat:

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

Detta är en implicit konvertering eftersom vi inte använder en konverteringsfunktion (som de nedan) för att explicit konvertera den. I det här fallet utför SQL Server en implicit konvertering bakom kulisserna när vi försöker tilldela datetime värde till en datetime2 variabel.

Vi kan se att datetime2 variabel har mer bråksekundersprecision, och vi slutar med en bråkdel av 1233333 (mot 123 för datetime värde).

Exempel 2 – Avrundning

datetime datatypen avrundas till steg om 0,000, 0,003 eller 0,007 sekunder. Även om du uttryckligen ställer in det till ett annat värde, kommer det att avrundas. Som du kanske förväntar dig kan detta orsaka mycket förvirring om du inte är medveten om hur det fungerar. Det kan inte bara orsaka förvirring när du använder datetime i sig kan det skapa extra förvirring när värdet konverteras till en annan datatyp.

Här är ett exempel som visar vad jag menar.

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

Resultat:

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

I det här exemplet satte jag bråksekunderna till 125 men datumtid rundade det upp till 127 (eftersom det bara kan avrundas till steg om 0,000, 0,003 eller 0,007 sekunder).

datetime2 värdet, ställ dock bråksekunderna till 1266667 .

Förresten, om vi bara skulle ställa in det initiala värdet till datetime2 i första hand skulle dess bråkdel ha returnerat 1250000 .

Exempel 3 – Precision/noggrannhet

En av fördelarna med datetime2 är att det låter dig ange bråksekundersprecisionen. Om du inte gör detta använder den 7 (därför använder det föregående exemplet 7).

Vi kan därför modifiera föregående exempel så att datetime2 värde använder samma bråkdelssekunderprecision som datetime datatyp.

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';

Resultat:

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

När vi gör detta visas datetime2 värde returnerar samma resultat som datetime värde. Den använder också samma mängd lagringsutrymme (8 byte). I det här fallet, datetime2 använder 7 byte för att lagra värdet och 1 byte för att lagra värdets precision.

Du kan till och med ange mindre bråkdelssekunders precision än datetime om du inte har något behov av den extra precisionen. Om du gör detta sparar du en hel byte på lagringsutrymme (din datetime2 värde kommer att använda 7 byte, jämfört med 8 byte för datetime värde).

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';

Resultat:

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

Tänk på att detta också kan leda till att bråkdelar av sekunder avrundas.

Exempel 4 – Explicit konvertering med CAST()

Här är ett exempel på en explicit konvertering. I det här fallet använder jag CAST() funktion direkt inom SELECT uttalande för att uttryckligen konvertera mellan datetime och 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)';

Resultat:

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

Exempel 5 – Explicit konvertering med CONVERT()

Här är ett exempel på en explicit konvertering med CONVERT() funktion istället för CAST() .

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

Resultat:

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

Microsofts rekommendation

Microsoft rekommenderar att du använder explicit casting när det finns ett blandat jämförelsescenario mellan dessa två datatyper:

Under databaskompatibilitetsnivå 130, implicita konverteringar från datetime till datetime2 datatyper visar förbättrad noggrannhet genom att ta hänsyn till bråkdels millisekunder, vilket resulterar i olika konverterade värden... Använd explicit casting för att datetime2 datatyp när ett blandat jämförelsescenario mellan datetime och datetime2 datatyper finns.


  1. Infoga trigger för att uppdatera en annan tabell med PostgreSQL

  2. Jämföra datum i Oracle SQL

  3. Öka prestanda med Bulk Collect i Oracle

  4. MySQL DATEDIFF() vs TIMESTAMPDIFF():Vad är skillnaden?