sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera 'datetime2' till 'datetimeoffset' i SQL Server (T-SQL-exempel)

Den här artikeln innehåller exempel på hur du konverterar en datetime2 värde till en datetimeoffset värde i SQL Server.

När du konverterar en datetime2 värde till datetimeoffset , kommer det resulterande värdet att bero på bråksekundersprecisionen som tilldelas varje datatyp, såväl som eventuell tidszonförskjutning du anger.

Båda datatyperna låter dig ange en bråkdelssekunderprecision från 0 till 7. Om du inte anger detta används standardskalan 7.

datetimeoffset datatypen inkluderar en tidszonförskjutning och kan bevara alla förskjutningar i det ursprungliga värdet. Men datetime2 har ingen tidszonsmedvetenhet, så det finns inga befintliga värden att bevara. I det här fallet är tidszonsförskjutningen som standard +00:00.

TODATETIMEOFFSET() funktion designades speciellt för att konvertera ett datum/tid-värde till datetimeoffset och lägg till en tidszonsförskjutning. Se dock mina kommentarer (och exempel) nedan angående detta alternativ.

Exempel 1 – Implicit konvertering

Först, här är ett exempel på en implicit konvertering mellan datetime2 och datumtidsförskjutning .

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                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Detta är en implicit konvertering eftersom vi inte använder en konverteringsfunktion (som de nedan) för att explicit konvertera den. I det här fallet utför SQL Server en implicit konvertering bakom kulisserna när vi försöker tilldela datetime2 värde till en datetimeoffset variabel.

Vi kan se att datetimeoffset variabeln kan använda samma precision som datetime2 värde (7 decimaler). Vi slutar också med en tidszonförskjutning på +00:00 .

Att använda 7 bråksekundersprecision orsakar datumtidsförskjutning att använda 11 byte för lagring (10 för data och 1 byte för precision). datetime2 typ använder 9 byte (8 för data och 1 byte för precision) när en skala på 7 används.

Du kan dock minska precisionen genom att ersätta 7:an med ett lägre nummer.

Exempel 2 – Avrundning

Om datumtidsförskjutning har en lägre precision än datetime2 värde, kommer det att avrundas uppåt.

Här är ett exempel:

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)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

I det här exemplet visas datetime2 värdet har en skala på 7 men datetimeoffset värdets skala är bara 6. Därför är dess precision endast till 6 decimaler, och dess sjätte siffra avrundas uppåt till 7 (istället för 6).

Exempel 3 – Explicit konvertering med CAST()

Här är ett exempel på en explicit konvertering. I det här fallet använder jag CAST() funktion direkt inom SELECT uttalande för att uttryckligen konvertera mellan datetime2 och datumtidsförskjutning .

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

Resultat:

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

Exempel 4 – Explicit konvertering med CONVERT()

Här är ett exempel på en explicit konvertering med CONVERT() funktion istället för CAST() .

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

Resultat:

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

Exempel 5 – Ändra tidszonförskjutningen

Om du konverterar från datetime2 till datetimeoffset , du gör det förmodligen för tidszonsförskjutningen. Det är också mycket troligt att du behöver ett annat värde än standardvärdet +00:00.

Lyckligtvis kan du använda TODATETIMEOFFSET() funktion för att ändra offset.

Du kan också använda den här funktionen för att konvertera den ursprungliga datetime2 värde till en datetimeoffset värde. Den här funktionen accepterar alla datum/tidsvärden som kan omvandlas till ett datetime2 värde och ett offsetvärde.

Här är ett exempel:

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

Resultat:

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

Och här är ett exempel med funktionen i SELECT uttalande:

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

Resultat:

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

En viktig punkt om TODATETIMEOFFSET() funktion är att den använder samma bråkdelprecision som datum/tid-argumentet som skickas till den.

Därför, om din datetime2 använder en lägre precision än datetimeoffset , du kan alltid tilldela den till en variabel med högre precision och sedan skicka det konverterade värdet till TODATETIMEOFFSET() .

Exempel:

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 (med vertikal utdata):

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00

  1. MySQL:Kloning av en MySQL-databas på samma MySql-instans

  2. Vilka metoder kan användas för att hantera olika versioner av redan existerande databaser?

  3. Vikten av underhåll på MSDB

  4. Hur man aktiverar bulkbehörighet i SQL Server