Den här artikeln innehåller exempel på hur du konverterar en datumtid värde till en tid värde i SQL Server.
En av fördelarna med att konvertera en datumtid värde till tid är att du minskar lagringsstorleken från 8 byte, ner till antingen 3, 4 eller 5 byte (beroende på vilken precision du använder under tiden värde). Strängt taget tid använder 4, 5 eller 6 byte, eftersom en extra byte används för att lagra dess precision.
När du konverterar en datumtid värde till tid , bara tidsdelen av värdet kopieras. Det exakta resultatet beror på bråksekundersprecisionen som du tilldelar tid . När tiden precisionen är mindre än datetime precision, avrundas bråksekunderna uppåt för att passa tiden precision.
datetime datatypen har högst 3 siffror för sin del av bråkdelssekunder. Dess noggrannhet är avrundad till steg om 0,000, 0,003 eller 0,007 sekunder.
tiden datatyp, å andra sidan, låter dig ange en bråkdelssekunderprecision från 0 till 7. Detta uppnås genom att använda tid(n ) syntax, där n är skalan från 0 till 7. Om du inte anger detta kommer den att använda 7, vilket ger en noggrannhet på 100 nanosekunder.
Exempel 1 – Implicit konvertering
Här är ett exempel på en implicit konvertering mellan datetime och tid .
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Resultat:
+-------------------------+------------------+ | datetime | time | |-------------------------+------------------| | 2025-05-21 10:15:30.123 | 10:15:30.1233333 | +-------------------------+------------------+
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 datetime värde till en tid variabel.
Det mest uppenbara med detta resultat ä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.
Vi kan också se att tiden variabel har mer bråksekundersprecision, och vi slutar med en bråkdel av 1233333 (mot 123 för datetime värde). Detta händer eftersom tiden värde använder standardskalan 7 (eftersom vi inte uttryckligen angav en skala).
Exempel 2 – Avrundning
datetime datatypen avrundas till steg om 0,000, 0,003 eller 0,007 sekunder. Även om du uttryckligen ställer in det till ett annat värde, kommer det att avrundas.
Här är ett exempel:
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'thetime';
Resultat:
+-------------------------+------------------+ | datetime | thetime | |-------------------------+------------------| | 2025-05-21 10:15:30.127 | 10:15:30.1266667 | +-------------------------+------------------+
I det här exemplet satte jag bråksekunderna till 125
men datumtid rundade det upp till
127
(eftersom det bara kan avrundas till steg om 0,000, 0,003 eller 0,007 sekunder).
tiden värdet, ställ dock bråksekunderna till 1266667 .
Om vi helt enkelt skulle ställa in det initiala värdet på tid i första hand skulle dess bråkdel ha returnerat 1250000 .
Exempel 3 – Precision/noggrannhet
Som nämnts, tiden datatyp låter dig ange bråksekundersprecisionen. Om du inte gör detta använder den 7 (därför använder det föregående exemplet 7).
Du kan ändra detta genom att använda tiden(n ) syntax. Därför kunde jag ha använt tid(7) för att de tidigare exemplen ska få samma resultat.
I det här exemplet tar jag bort bråkdelssekunderna helt och hållet genom att använda tid(0) :
DECLARE @thedatetime datetime, @thetime time(0); SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Resultat:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+----------+
När vi gör detta, lagringsstorleken för tiden värdet reduceras till 3 byte (4 byte inklusive precision) i motsats till 8 byte för datetime värde.
Tänk på att om du använder en lägre precision än det ursprungliga värdet kommer resultatet att avrundas uppåt för att passa den specificerade precisionen.
Exempel:
DECLARE @thedatetime datetime, @thetime time(0); SET @thedatetime = '2025-05-21 10:15:30.525'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Resultat:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.527 | 10:15:31 | +-------------------------+----------+
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 datetime och tid .
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS time(0)) AS 'time(0)';
Resultat:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 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 @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(time(0), @thedatetime) AS 'time(0)';
Resultat:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+