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

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

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

Når du konverterer en datotid værdi til datetimeoffset , vil den resulterende værdi afhænge af den brøkdelsekunders præcision, som du tildeler datetimeoffset , samt enhver tidszoneforskydning, du angiver.

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.

datetime offset 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). Den har også en tidszoneforskydning og kan bevare eventuelle forskydninger i den oprindelige værdi. Dog datotid har ingen tidszonebevidsthed, så der er ingen eksisterende værdier at bevare. I dette tilfælde er tidszoneforskydningen som standard +00:00.

SQL Server har faktisk TODATETIMEOFFSET() funktion, som er specielt designet til at konvertere en dato/tidsværdi til datetime offset og tilføje en tidszoneforskydning. Der er dog en subtil detalje at være opmærksom på, når du bruger denne funktion, og jeg forklarer dette nedenfor (med eksempler).

Eksempel 1 – Implicit konvertering

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

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);SET @thedatetime ='2025-05-21 10:15:30.123';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset(7)';

Resultat:

+------------------------+------------------------ ----------------+| dato og klokkeslæt | datotidsforskydning(7) ||------------------------+------------------------ ------------------|| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +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 datetime værdi til en datotidsforskydning variabel.

Vi kan se, at datetime offset variabel har mere brøksekunders præcision, og vi ender med en brøkdel af 1233333 (i forhold til 123 for datetime værdi). Vi ender også med en tidszoneforskydning på +00:00 .

Brug af 7 brøksekunders præcision forårsager datetime offset at bruge 10 bytes til lagring (11 bytes, hvis du inkluderer den byte, der gemmer dens præcision). Til sammenligning datetime bruger kun 8 bytes. Du kan dog reducere præcisionen af ​​datetime offset værdi ved at erstatte de 7 med et lavere tal. Dette er det samme koncept, som når du bruger datetime2 datatype. Se Konverter 'datetime' til 'datetime2' i SQL Server for eksempler på, hvordan dette kan påvirke slutresultatet.

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. Dette kan give dig 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, @thedatetimeoffset datetimeoffset;SET @thedatetime ='2025-05-21 10:15:30.125';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset( 7)';

Resultat:

+------------------------+------------------------ ----------------+| dato og klokkeslæt | datotidsforskydning(7) ||------------------------+------------------------ ------------------|| 21-05-2025 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |+--------------------------------+-------- ----------------------------+

I dette eksempel satte jeg brøksekunderne til 125 men datotid rundede det op til 127 (fordi denne datatype kun kan afrundes til trin på .000, .003 eller .007 sekunder).

datetime offset værdi på den anden side, indstil brøksekunderne til 1266667 .

Men hvis vi blot ville indstille startværdien til datetime offset i første omgang ville dens brøkdel have returneret 1250000 .

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 for eksplicit at konvertere mellem dato og klokkeslæt og datotidsforskydning .

DECLARE @thedatetime datetime;SET @thedatetime ='2025-05-21 10:15:30.125';SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Resultat:

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

Resultat:

+------------------------+------------------------ ----------------+| dato og klokkeslæt | datotidsforskydning(7) ||------------------------+------------------------ ------------------|| 21-05-2025 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |+--------------------------------+-------- ----------------------------+

Eksempel 5 – Ændring af tidszoneforskydning

Hvis du går ind i alle de problemer med at konvertere din datotid værdier til datetimeoffset , har du sandsynligvis brug for tidszoneforskydningen. Og der er en stærk mulighed for, at du vil have den sat til noget andet end +00:00.

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

Du kan også bruge denne funktion til at konvertere den oprindelige datotid værdi til en datotidsforskydning værdi. Denne funktion accepterer en dato/klokkeslætsværdi (der kan omdannes til en datetime2 værdi), og en offsetværdi.

Her er et eksempel:

ERKLÆR @datoklokkeslæt datotidspunkt, @datotidsforskydning datotidspunktforskydning;SET @datotidspunkt ='2025-05-21 10:15:30.125';INDSTIL @datotidstidsforskydning =TODATOTIMEOFFSET(@datotidspunkt, '+07:00'); SELECT @datotidspunkt AS 'datetime', @thedatetimeoffset AS 'datetimeoffset';

Resultat:

+------------------------+------------------------ ----------------+| dato og klokkeslæt | datotidsforskydning(7) ||------------------------+------------------------ ------------------|| 21-05-2025 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |+--------------------------------+-------- ----------------------------+

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

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

Resultat:

+------------------------+------------------------ ----------------+| dato og klokkeslæt | datotidsforskydning(7) ||------------------------+------------------------ ------------------|| 21-05-2025 10:15:30.127 | 2025-05-21 10:15:30.1270000 +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. I dette tilfælde er det et datotidspunkt argument, så det har en skala på 3 (dvs. 3 brøksekunder). Dette kan være et problem for dig eller ikke. Hvis det er det, kan du altid konvertere det til en datotidsforskydning først, send derefter den konverterede værdi til TODATETIMEOFFSET() .

Eksempel:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);SET @thedatetime ='2025-05-21 10:15:30.125';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset', TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') SOM 'Ændret';

Resultat (ved hjælp af lodret output):

datotid | 2025-05-21 10:15:30.127datotidsforskydning | 2025-05-21 10:15:30.1266667 +00:00Ændret | 2025-05-21 10:15:30.1266667 +07:00
  1. Indsæt flere rækker med PDO-forberedte erklæringer

  2. Tildel Vælg på en visning ikke en basistabel, når basistabellen er i en anden database

  3. CriteriaQuery måned og år filter

  4. 2 måder at oprette en database på en sammenkædet server ved hjælp af T-SQL