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

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

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

Når du konverterer en smalldatetime værdi til datetimeoffset , smalldatetime værdien kopieres til datotidsforskydningen værdi. Brøksekunderne er sat til 0, og tidszoneforskydningen er sat til +00:0.

Den smalldatetime datatypen har ikke nogen brøksekunder, og dens sekunder-komponent er altid sat til nul (:00). Dens nøjagtighed er til nærmeste minut.

datotidsforskydningen 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 smalldatetime har ingen tidszonebevidsthed, så der er ingen eksisterende værdier at bevare. I dette tilfælde er tidszoneforskydningen sat til +00:00.

SQL Server har faktisk TODATETIMEOFFSET() funktion, som er specielt designet til at konvertere en dato/tidsværdi til datotidsforskydning og tilføje en tidszoneforskydning. Se dog nedenfor for mine kommentarer og nogle eksempler vedrørende denne mulighed.

Eksempel 1 – Implicit konvertering

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Resultat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 smalldatetime værdi til en datotidsforskydning variabel.

Vi kan se, at datetime offset variabel har en brøkdel ( 0000000 ), mens smalldatetime værdi har ingen brøkdel, og dens minutter blev rundet op, da den blev tildelt den oprindelige værdi. datotidsforskydningen værdien inkluderer også en tidszoneforskydning på +00:00 .

Brug af 7 brøksekunders præcision forårsager datetime offset at bruge 11 byte til lagring (10 byte til lagring af data, 1 byte til præcision). Til sammenligning smalldatetime bruger kun 4 bytes. Du kan dog reducere præcisionen af ​​datetime offset værdi ved at erstatte de 7 med et lavere tal. Hvis du vil fjerne brøksekundersdelen helt, skal du blot bruge datetimeoffset(0) . Hvis du gør dette, reduceres lagerstørrelsen til 9 bytes (inklusive 1 for præcisionen).

Eksempel 2 – 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 smalldatetime og datotidsforskydning .

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

Resultat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Eksempel 3 – 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 @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(datetimeoffset(7), @thesmalldatetime) AS 'datetimeoffset(7)';

Resultat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

Eksempel 4 – Ændring af tidszoneforskydning

Det faktum, at du konverterer din smalldatetime værdier til datetimeoffset betyder, at du sandsynligvis gør det for tidszoneforskydningen. Og det er sandsynligt, at du vil have det sat til en anden offset end +00:00 (standard offset).

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

Du kan også bruge denne funktion til at konvertere den oprindelige smalldatetime 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:

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset';

Resultat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

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

DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';

Resultat:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 en smalldatetime argument, som ikke har brøkdele sekunder.

Mit system returnerer efterfølgende nuller med datotidsforskydning brøkdel, men du kan måske se noget som dette:

+---------------------+----------------------------+
| smalldatetime       | datetimeoffset             |
|---------------------+----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 |
+---------------------+----------------------------+

Uanset hvad, kan du stadig drage fuld fordel af datetime offset datatypens præcision, hvis du skal ændre værdien senere.

Her er et eksempel, der bruger DATEADD() funktion for at ændre brøkdelen af ​​sekunder efter konverteringen allerede er udført.

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset',
  DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';

Resultat (ved hjælp af lodret output):

smalldatetime  | 2025-05-21 10:16:00
datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00
Modified       | 2025-05-21 10:16:00.1234567 +07:00

  1. Hvad skal du kontrollere, hvis MySQL I/O-udnyttelsen er høj

  2. Indstil værdi i afhængighed af Helm-diagrammet

  3. Fejlfinding af SQL Server-transaktionelle replikeringsproblemer

  4. Vender tilbage fra en funktion med OUT parameter