sql >> Databasteknik >  >> RDS >> Sqlserver

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

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

En av fördelarna med att konvertera en datetime2 värde till tid är att du minskar lagringsstorleken från mellan 6 och 8 byte, ner till mellan 3 och 5 byte (beroende på precisionen varje datatyp har tilldelat den). Strängt taget används 1 extra byte för att lagra precisionen för dessa datatyper, så du bör lägga till 1 byte till dessa mängder.

Självklart förlorar du datumdelen under konverteringen, men du skulle inte göra den här konverteringen om du behövde behålla datumdelen.

När du konverterar en datetime2 värde till tid , bara tidsdelen av värdet kopieras. Det exakta resultatet kommer att bero på bråksekundersprecisionen som tilldelas varje typ. När tiden precisionen är mindre än datetime2 precision, avrundas bråksekunderna uppåt för att passa tiden precision.

När det gäller precision låter båda datatyperna dig ange en skala från 0 decimaler upp till 7. Därför har du möjlighet att utföra konverteringen utan att förlora några bråkdelar av sekunder eller få resultatet avrundat uppåt.

Exempel 1 – Implicit konvertering

Här är ett exempel på en implicit konvertering mellan datetime2 och tid .

DECLARE @thedatetime2 datetime2, @thetime time;SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'time';

Resultat:

+------------------------------------+---------------- --+| datetime2 | tid ||-------------------------------------+---------------- -|| 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 |+------------------------------------+---------------- -----+

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

Det mest uppenbara med det här resultatet är att tiden värdet inkluderar inte datumet. Detta är att vänta, eftersom tiden datatypen är endast till för att lagra tidsvärden, inte datumvärden.

I det här exemplet använder båda datatyperna också sin standardprecision (som är en skala på 7). Det betyder att tiden värdet hamnar med samma precision som datetime2 värde. Anledningen till att jag vet att de använder sin standardprecision är för att jag inte angav en bråkdelssekundskala när jag deklarerade dem.

Exempel 2 – Konvertera till en högre precision

I det här exemplet är tiden variabeln använder högre precision till datetime2 variabel.

DEKLARE @thedatetime2 datetime2(4), @thetime time(7);SET @thedatetime2 ='2025-05-21 10:15:30.1234567';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'tid';

Resultat:

+---------------------------+------------------------+ | datetime2 | tid ||--------------------------------+----------------|| 2025-05-21 10:15:30.1235 | 10:15:30.1235000 |+--------------------------------+---------------- --+

I det här fallet datetime2 variabeln använder en skala på 4 och tiden variabel använder 7.

Detta resulterar i datetime2 avrundar bråksekunderna uppåt, så att vi får 1235 istället för 1234 . Det betyder också att när vi konverterar det till tid , slutar värdet med 3 avslutande nollor (eftersom vi angav en skala på 7). Detta innebär också att tiden värdes lagringsstorlek är 5 byte (6 inklusive precision) jämfört med 4 byte (5 inklusive precision) om vi hade gett det en skala på 4.

Exempel 3 – Konvertera till en lägre precision

I det här exemplet är tiden variabeln använder lägre precision till datetime2 variabel.

DEKLARE @thedatetime2 datetime2(7), @thetime time(0);SET @thedatetime2 ='2025-05-21 10:15:30.5678912';SET @thetime =@thedatetime2;SELECT @thedatetime2 AS 'datetime2', @thetime AS 'tid';

Resultat:

+-------------------------------------+--------+| datetime2 | tid ||------------------------------------+--------|| 2025-05-21 10:15:30.5678912 | 10:15:31 |+-------------------------------------+---------+ 

Så i det här fallet tid ’s skala reduceras till 0, vilket innebär att inga bråkdelar ingår i resultatet. Sekunderna avrundas också därefter.

tiden värde använder 4 byte lagring (inklusive precision), jämfört med 9 byte för datetime2 värde (och jämfört med 6 byte för tiden värde i föregående exempel).

Exempel 4 – 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 tid .

DECLARE @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS time(0)) AS 'time( 0)';

Resultat:

+------------------------+-----------+| datetime2 | tid(0) ||------------------------+-----------|| 2025-05-21 10:15:30.123 | 10:15:30 |+------------------------+----------+

Exempel 5 – Explicit konvertering med CONVERT()

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

DECLARE @thedatetime2 datetime2(3);SET @thedatetime2 ='2025-05-21 10:15:30.123';SELECT @thedatetime2 AS 'datetime2', CONVERT(time(0), @thedatetime2) AS 'time( 0)';

Resultat:

+------------------------+-----------+| datetime2 | tid(0) ||------------------------+--------|| 2025-05-21 10:15:30.123 | 10:15:30 |+-------------------------+----------+

  1. Varför returnerar IS NOT NULL NULL-värden för en Varchar(max) i SQL Server?

  2. Oracle sql handledning:Begränsning av datamängden

  3. Hur man returnerar ett arguments position i en lista med argument i MySQL

  4. MySQL Group av SUM