sql >> Databasteknik >  >> RDS >> Sqlserver

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

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

När du konverterar en smalldatetime värde till datetimeoffset , smalldatetime värdet kopieras till datetimeoffset värde. Bråksekunderna sätts till 0 och tidszonsförskjutningen är satt till +00:0.

smalldatetime datatypen har inga bråkdelar av sekunder, och dess sekundkomponent är alltid noll (:00). Dess noggrannhet är till närmaste minut.

datetime offset datatyp, å andra sidan, låter dig ange en bråkdelssekunderprecision från 0 till 7. Om du inte anger detta kommer den att använda 7 (standard). Den har också en tidszonförskjutning och kan bevara alla förskjutningar i det ursprungliga värdet. Men smalldatetime har ingen tidszonsmedvetenhet, så det finns inga befintliga värden att bevara. I detta fall är tidszonsförskjutningen inställd på +00:00.

SQL Server har faktiskt TODATETIMEOFFSET() funktion, som är speciellt utformad för att konvertera ett datum-/tidsvärde till datetimeoffset och lägg till en tidszonsförskjutning. Men se nedan för mina kommentarer och några exempel angående detta alternativ.

Exempel 1 – Implicit konvertering

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

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 |
+---------------------+------------------------------------+

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 smalldatetime värde till en datetimeoffset variabel.

Vi kan se att datetimeoffset variabel har en bråkdel ( 0000000 ), medan smalldatetime värde har ingen bråkdel, och dess minuter avrundades uppåt när det initiala värdet tilldelades. datetime offset värdet inkluderar också en tidszonförskjutning på +00:00 .

Att använda 7 bråksekundersprecision orsakar datumtidsförskjutning att använda 11 byte för lagring (10 byte för att lagra data, 1 byte för precision). Som jämförelse, smalldatetime använder endast 4 byte. Du kan dock minska precisionen för datetimeoffset värde genom att ersätta 7:an med ett lägre nummer. Om du vill ta bort delsekundersdelen helt och hållet, använd bara datetimeoffset(0) . Om du gör detta kommer lagringsstorleken att minska till 9 byte (inklusive 1 för precisionen).

Exempel 2 – 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 smalldatetime och datumtidsförskjutning .

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 |
+---------------------+------------------------------------+

Exempel 3 – Explicit konvertering med CONVERT()

Här är ett exempel på en explicit konvertering med CONVERT() funktion istället för 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 |
+---------------------+------------------------------------+

Exempel 4 – Ändra tidszonsförskjutningen

Det faktum att du konverterar din smalldatetime värden till datetimeoffset betyder att du förmodligen gör det för tidszonsförskjutningen. Och det är troligt att du vill att den ska ställas in på en annan offset än +00:00 (standardoffset).

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 smalldatetime värde till en datetimeoffset värde. Den här funktionen accepterar ett datum/tid-värde (som kan lösas till ett datetime2 värde) och ett offsetvärde.

Här är ett exempel:

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 |
+---------------------+------------------------------------+

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

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 |
+---------------------+------------------------------------+

En viktig punkt om TODATETIMEOFFSET() funktion är att den använder samma bråkdelprecision som datum/tid-argumentet som skickas till den. I det här fallet är det en smalldatetime argument, som inte har några bråkdelar.

Mitt system returnerar avslutande nollor med datetimeoffset bråkdel, men du kan se något sånt här:

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

Hur som helst kan du fortfarande dra full nytta av datetime offset datatypens precision om du behöver ändra värdet senare.

Här är ett exempel som använder DATEADD() funktion för att ändra bråkdelssekunderna efter att konverteringen redan har gjorts.

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

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. Förstå ACID-modellen för databashantering

  2. Hur kan jag använda en MySql användardefinierad variabel i ett .NET MySqlCommand?

  3. Fråga med flera värden i en kolumn

  4. Hur man skapar en MySQL-databas med hjälp av cPanel API