sql >> Database teknologi >  >> RDS >> Sqlserver

Konverter 'datetime' til 'datetime2' i SQL Server (T-SQL-eksempler)

Denne artikel indeholder eksempler på konvertering af en datotid værdi til en datetime2 værdi i SQL Server.

Når du konverterer en datotid værdi til datetime2 , vil den resulterende værdi afhænge af brøksekunders præcision, som du tildeler datetime2 .

datoen datatypen har maksimalt 3 cifre for sin del af brøksekunder. Dens nøjagtighed er afrundet til trin på 0,000, 0,003 eller 0,007 sekunder.

datetime2 datatype giver dig på den anden side mulighed for at angive en brøksekunders præcision fra 0 til 7. Hvis du ikke angiver dette, vil den bruge 7 (standard).

Eksempel 1 – Implicit konvertering

Her er et eksempel på en implicit konvertering mellem datetime og 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 |
+-------------------------+-----------------------------+

Dette er en implicit konvertering, fordi vi ikke bruger en konverteringsfunktion (som dem nedenfor) til eksplicit at konvertere den. I dette tilfælde udfører SQL Server en implicit konvertering bag kulisserne, når vi forsøger at tildele datetime værdi til en datetime2 variabel.

Vi kan se, at datetime2 variabel har mere brøksekunders præcision, og vi ender med en brøkdel af 1233333 (i forhold til 123 for datetime værdi).

Eksempel 2 – Afrunding

datoen datatypen er afrundet til trin på 0,000, 003 eller 0,007 sekunder. Selvom du udtrykkeligt indstiller den til en anden værdi, bliver den afrundet. Som du måske forventer, kan dette forårsage en masse forvirring, hvis du ikke er klar over, hvordan det fungerer. Det kan ikke kun forårsage forvirring, når du bruger datetime i sig selv kan det forårsage ekstra forvirring, når den værdi konverteres til en anden datatype.

Her er et eksempel, der viser, hvad jeg mener.

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 dette eksempel satte jeg brøksekunderne til 125 men datotid rundede det op til 127 (fordi det kun kan afrundes til trin på 0,000, 003 eller 0,007 sekunder).

datetime2 værdi skal du dog indstille brøksekunderne til 1266667 .

Forresten, hvis vi blot ville indstille startværdien til datetime2 i første omgang ville dens brøkdel have returneret 1250000 .

Eksempel 3 – Præcision/nøjagtighed

En af fordelene ved datetime2 er, at det giver dig mulighed for at angive brøksekunders præcision. Hvis du ikke gør dette, bruger den 7 (derfor bruger det forrige eksempel 7).

Vi kan derfor ændre det foregående eksempel, så datetime2 værdi bruger den samme brøksekunders præcision som datetime datatype.

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 dette, vises datetime2 værdi returnerer det samme resultat som datetime værdi. Den bruger også den samme mængde lagerplads (8 bytes). I dette tilfælde datetime2 bruger 7 byte til at gemme værdien og 1 byte til at gemme værdiens præcision.

Du kan endda angive mindre brøksekunders præcision end datotid hvis du ikke har brug for den ekstra præcision. Hvis du gør dette, sparer du en hel byte på lagerplads (din datetime2 værdi vil bruge 7 bytes sammenlignet med 8 bytes for datetime værdi).

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 |
+-------------------------+------------------------+

Husk, at dette også kan resultere i, at brøkdele af sekunder afrundes.

Eksempel 4 – Eksplicit konvertering ved hjælp af CAST()

Her er et eksempel på en eksplicit konvertering. I dette tilfælde bruger jeg CAST() funktion direkte i SELECT sætning for eksplicit at konvertere mellem dato og klokkeslæt og 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 |
+-------------------------+-------------------------+

Eksempel 5 – Eksplicit konvertering ved hjælp af CONVERT()

Her er et eksempel på en eksplicit konvertering ved hjælp af CONVERT() funktion i stedet for 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 anbefaling

Microsoft anbefaler at bruge eksplicit casting, når der findes et blandet sammenligningsscenarie mellem disse to datatyper:

Under databasekompatibilitetsniveau 130, implicitte konverteringer fra datetime til datetime2 datatyper viser forbedret nøjagtighed ved at tage højde for brøk millisekunder, hvilket resulterer i forskellige konverterede værdier... Brug eksplicit casting til datetime2 datatype, når der er et blandet sammenligningsscenarie mellem datetime og datetime2 datatyper findes.


  1. Kører kun PostgreSQL i hukommelsen

  2. Er der nogen forskel mellem !=og <> i Oracle Sql?

  3. Hvordan kontrollerer man, om en streng er en unik identifikator?

  4. Sådan installeres, sikres og ydeevneindstilling af MariaDB-databaseserveren