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

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

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

Når du konverterer en datotidsforskydning værdi til datetime2 , kopieres datoen og klokkeslættet til datetime2 værdi, og tidszonen afkortes. De brøkdele sekunder afkortes også, så de passer, hvis destinationspræcisionen er lavere.

datetime offset datatype giver dig mulighed for at angive en brøksekunders præcision fra 0 til 7 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.

datetime2 datatypen giver dig også mulighed for at angive en brøksekunders præcision fra 0 til 7 (ved at bruge datetime2(n) syntaks). Den har ikke tidszonebevidsthed. Dens opbevaringsstørrelse er enten 6, 7 eller 8, afhængigt af den anvendte præcision.

Bemærk, at lagerbeløbene, der er angivet her, er de beløb, der er angivet i Microsoft-dokumentationen. Disse datatyper bruger dog også 1 byte til at gemme præcisionen. Tilføj derfor 1 byte til de her anførte mængder for at få et mere komplet billede af lagerkravene.

Eksempel 1 – Implicit konvertering

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

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

Resultat:

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

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 datetime2 variabel.

I dette eksempel bruger begge datatyper standardpræcisionen (7 decimaler). Derfor var brøkdelen 1234567 for begge resultater.

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

I denne konvertering er lagerstørrelsen faldet fra 10 bytes (for datetime offset ) til 8 bytes (for datetime2 ), men bemærk, at 1 byte tilføjes for at gemme præcisionen.

Eksempel 2 – Forskellig præcision

Her er et eksempel, der viser, hvad der sker, hvis datetime2 værdien bruger en lavere præcision i forhold til datotidsforskydningen værdi.

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

Resultat:

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

I dette eksempel er datetime offset har en skala på 7 men datetime2 værdi har en skala på kun 3 . Derfor blev brøksekunderne afkortet for at passe.

Bemærk, at dette kan forårsage afrunding. Her er et eksempel, hvor brøkdelen af ​​datetime2 værdien rundes op til 124 .

DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1235555 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT @thedatetimeoffset 'datetimeoffset', @thedatetime2 AS 'datetime2';

Resultat:

+--------------------------------------------+-------- ----------------+| datotidsforskydning | datetime2 ||---------------------------------------------+---------------- ---------------|| 2025-05-21 10:15:30.1234567 +07:00 | 21-05-2025 10:15:30.124 |+-------------------------------------------+- ------------------------+

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 datetime2 .

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

Resultat:

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

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 'datetime offset', CONVERT(datetime2, @thedatetimeoffset') AS 'datetime2 /pre> 

Resultat:

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

  1. Hvordan beregnes gennemsnittet af en kolonne og derefter inkludere det i en udvalgt forespørgsel i Oracle?

  2. Forbinder F# til Salesforce.com

  3. Hvordan indstilles primær nøgle til automatisk stigning i PostgreSQL?

  4. Sådan genererer du tilføje kolonneerklæring for alle tabellerne i en database i SQL Server - SQL Server / T-SQL selvstudium del 49