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

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

Der er sandsynligvis meget få use cases, der ville få dig til at konvertere en datetime2 værdi til datetime i SQL Server. Især datetime2 datatypen kan indstilles til at bruge samme lagerstørrelse som datetime , men med højere præcision. Så i de fleste tilfælde ville du være bedre stillet med datetime2 end med et datotidspunkt . Microsoft anbefaler også at bruge datetime2 i stedet for datotid .

Men hvis du befinder dig i den situation, hvor du skal udføre denne konvertering, indeholder denne artikel nogle eksempler og overvejelser, der kan være til hjælp.

Når du konverterer en datetime2 værdi til datetime , vil den resulterende værdi afhænge af brøkdelen af ​​sekunder, der blev tildelt datetime2 værdi, såvel som dens præcision.

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

datoen datatype på den anden side 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.

Derfor, hvis datetime2 bruger en skala fra 3, vil den resulterende værdi være meget tæt (hvis ikke identisk) med den oprindelige værdi. Men på grund af den lavere nøjagtighed af datetime , kan resultaterne være anderledes på grund af den afrunding, den udfører.

Eksempel 1 – Implicit konvertering

Her er et eksempel på en implicit konvertering mellem datetime2 og datotid .

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

Resultat:

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

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 datetime2 værdi til en datotid variabel.

Vi kan se, at datetime variabel har mindre brøksekunders præcision, og vi ender med en brøkdel af 123 selvom den oprindelige brøkdel var 1234567 .

I dette tilfælde blev der ikke udført nogen afrunding.

Eksempel 2 – Præcision/nøjagtighed og 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.

Dette gælder også, når du konverterer fra en anden datatype (såsom det, vi laver her).

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

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

Resultat:

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

I dette eksempel indstiller jeg brøksekunderne af datetime2 værdi til 1256789 men datotid rundede det op til 127 (fordi det kun kan afrundes til trin på 0,000, 003 eller 0,007 sekunder).

Det er vigtigt at bemærke, at dette stadig vil være sandt, selvom vi kun tildeler 3 brøksekunder til datetime2 værdi.

Eksempel:

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

Resultat:

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

Det kan også betale sig at være opmærksom på enhver afrunding, der kan forekomme til den oprindelige datetime2 værdi. datetime2 værdien kunne i sig selv rundes op, hvis vi forsøger at tildele en værdi med flere brøksekunder end dens egen skala.

Eksempel:

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

Resultat:

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

I dette tilfælde forsøger jeg at tildele en værdi med en brøkdel af 1256789 . Men fordi datetime2(3) værdien har kun en skala på 3, den kan kun understøtte 3 decimaler, og i dette tilfælde rundes det sidste ciffer op (fordi det følgende ciffer er 5 eller højere).

Både datetime2(3) og datotid bruge den samme mængde lagerplads (8 bytes). datetime2(3) datatypen bruger faktisk 7 bytes til at gemme dataene, men ekstra 1 byte til at gemme præcisionen.

Eksempel 3 – 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 til eksplicit at konvertere mellem datetime2 og datotid .

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

Resultat:

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

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

Resultat:

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

  1. PHP &mySQL:År 2038 Bug:Hvad er det? Hvordan løses det?

  2. Hvordan kan jeg kombinere flere rækker til en kommasepareret liste i Oracle?

  3. SQL Server AlwaysOn ( Availability Group ) Arkitektur og trin for trin installation -1

  4. Sådan fortæller du, om en beregnet kolonne er deterministisk i SQL Server