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

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

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

Når du konverterer en datotidsforskydning værdi til datetime , dato- og tidsværdierne kopieres, og tidszoneforskydningen afkortes. Når den fraktionelle præcision af dato-tidsforskydningen værdien er større end tre cifre, er værdien afkortet.

datetime offset datatype giver dig mulighed for at angive en brøksekunders præcision fra 0 til 7. Dette gøres ved at bruge datetimeoffset(n) syntaks. Hvis du ikke angiver dette, vil det bruge 7 (standard). Den har også en tidszoneforskydning. Denne datatypes lagerstørrelse er enten 8, 9 eller 10 bytes, afhængigt af den anvendte præcision. En anden byte bruges til at gemme præcisionen, så dette tilføjer 1 byte til disse tal.

datoen datatype har på den anden side 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. Denne datatype har ingen tidszonebevidsthed og derfor ingen tidszoneforskydning. Dens lagerstørrelse er 8 bytes.

Eksempel 1 – Implicit konvertering

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

DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset, @thedatetimeoffset' AS 'datetime';

Resultat:

+--------------------------------------------+-------- ----------------+| datotidsforskydning | dato og klokkeslæt ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 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 datetime offset 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.

Vi ser også, at tidszoneforskydningen blev afkortet. datoen datatypen har ingen tidszonebevidsthed.

I denne konvertering er lagerstørrelsen faldet fra 10 bytes (11 bytes, hvis du inkluderer den ekstra byte, der gemmer præcisionen) for datotidsforskydning , til 8 bytes for datetime . Men hvis datetime offset værdi havde brugt en skala mellem 0 og 2, ville den kun have brugt 8 bytes (9 inklusive præcision).

Hvis den havde brugt en skala fra 3 (svarende til datetime værdi), ville lagerstørrelsen have været 9 bytes (10 med præcision). Dens nøjagtighed ville dog have været højere end datetime . Naturligvis ville nøjagtigheden blive reduceret, så snart vi konverterede den til datetime .

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 @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1250000 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset, @thedatetimeoffset, @thedatetimeoffset' AS 'datetime';

Resultat:

+--------------------------------------------+-------- ----------------+| datotidsforskydning | dato og klokkeslæt ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1250000 +07:00 | 21-05-2025 10:15:30.127 |+------------------------------------------+- ------------------------+

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

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 datetimeoffset og datotid .

DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime) 

Resultat:

+--------------------------------------------+-------- ----------------+| datotidsforskydning | dato og klokkeslæt ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 21-05-2025 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 @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime, @thedatetimeoffset) 

Resultat:

+--------------------------------------------+-------- ----------------+| datotidsforskydning | datetime ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 21-05-2025 10:15:30.123 |+-------------------------------------------+- ------------------------+

  1. ORA-00947 Ikke nok værdier, mens typen erklæres globalt

  2. Hvad er en betroet forbindelse?

  3. Hvordan indstiller jeg programmæssigt forbindelsesstrengen for Entity-Framework Code-First?

  4. Få resultatet af dynamisk SQL til en variabel til sql-server