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

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

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

Når du konverterer en datetime2 værdi til datetimeoffset , vil den resulterende værdi afhænge af den brøksekunders præcision, der er tildelt hver datatype, samt enhver tidszoneforskydning, du angiver.

Begge datatyper giver dig mulighed for at angive en brøksekunders præcision fra 0 til 7. Hvis du ikke angiver dette, bruges standardskalaen på 7.

datetime offset datatypen inkluderer en tidszoneforskydning og kan bevare eventuelle forskydninger i den oprindelige værdi. Dog datetime2 har ingen tidszonebevidsthed, så der er ingen eksisterende værdier at bevare. I dette tilfælde er tidszoneforskydningen som standard +00:00.

TODATETIMEOFFSET() funktion blev specifikt designet til at konvertere en dato/tidsværdi til datetime offset og tilføje en tidszoneforskydning. Se dog mine kommentarer (og eksempler) nedenfor vedrørende denne mulighed.

Eksempel 1 – Implicit konvertering

For det første er her et eksempel på en implicit konvertering mellem datetime2 og datotidsforskydning .

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

Resultat:

+-------------------------------------+---------------- --------------------+| datetime2 | datotidsforskydning(7) ||------------------------------+------------- ----------------------|| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |+-----------------------------------+---- --------------------------------+

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

Vi kan se, at datetime offset variabel er i stand til at bruge samme præcision som datetime2 værdi (7 decimaler). Vi ender også med en tidszoneforskydning på +00:00 .

Brug af 7 brøksekunders præcision forårsager datetime offset at bruge 11 byte til lagring (10 til data og 1 byte til præcision). datetime2 type bruger 9 bytes (8 for data og 1 byte for præcision), når der bruges en skala på 7.

Du kan dog reducere præcisionen ved at erstatte 7'eren med et lavere tal.

Eksempel 2 – Afrunding

Hvis datotidsforskydning har en lavere præcision end datetime2 værdi, vil den blive rundet op.

Her er et eksempel:

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

Resultat:

+-------------------------------------+---------------- --------------------+| datetime2(7) | datotidsforskydning(6) ||------------------------------+------------- ----------------------|| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |+-----------------------------------+---- --------------------------------+

I dette eksempel er datetime2 værdien har en skala på 7, men datetime offset værdiens skala er kun 6. Derfor er dens præcision kun til 6 decimaler, og dens sjette ciffer rundes op til 7 (i stedet for 6).

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

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

Resultat:

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

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(datetimeoffset, @thedatetime2) AS 'datetimeoffset';

Resultat:

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

Eksempel 5 – Ændring af tidszoneforskydning

Hvis du konverterer fra datetime2 til datotidsforskydning , du gør det sandsynligvis for tidszoneforskydningen. Det er også meget sandsynligt, at du skal bruge en anden værdi end standardværdien +00:00.

Heldigvis kan du bruge TODATETIMEOFFSET() funktion for at ændre offset.

Du kan også bruge denne funktion til at konvertere den originale datetime2 værdi til en datotidsforskydning værdi. Denne funktion accepterer enhver dato/tidsværdi, der kan omdannes til en datetime2 værdi og en offsetværdi.

Her er et eksempel:

ERKLÆR @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thedatetimeoffset =TODATETIMEOFFSET(@datotiden2, '+07:00'); 'datetime2', @thedatetimeoffset AS 'datetimeoffset';

Resultat:

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

Og her er et eksempel, der bruger funktionen i SELECT erklæring:

DECLARE @thedatetime2 datetime2 ='2025-05-21 10:15:30.1234567';VÆLG @thedatetime2 AS 'datetime2', TODATETIMEOFFSET(@thedatetime2, '+07:00') AS 'datetime offset';

Resultat:

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

Et vigtigt punkt om TODATETIMEOFFSET() funktion er, at den bruger den samme brøkpræcision som dato/klokkeslætsargumentet, der er sendt til den.

Derfor, hvis din datetime2 bruger en lavere præcision end datetime offset , kan du altid gentildele den til en variabel med en højere præcision og derefter overføre den konverterede værdi til TODATETIMEOFFSET() .

Eksempel:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);SET @lowprecision ='2025-05-21 10:15:30.123';SET @highprecision =@lowprecision;SELECT @lowprecision AS 'lowprecision', @highprecision AS 'highprecision', TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Resultat (ved hjælp af lodret output):

lavpræcision | 2025-05-21 10:15:30.123højpræcision | 2025-05-21 10:15:30.1230000Ændret | 2025-05-21 10:15:30.1230000 +07:00
  1. ALL_PROCEDURES-visningen viser ikke PROCEDURE_NAME

  2. Hvad er korrekt JDBC URL-syntaks, hvis der bruges Oracle-punge?

  3. Vigtige ting at overvåge i PostgreSQL - Analyse af din arbejdsbyrde

  4. Brug af JavaFX-tabeller til at organisere data