Denne artikel indeholder eksempler på konvertering af en datotid værdi til en tid værdi i SQL Server.
En af fordelene ved at konvertere en datotid værdi til tid er, at du reducerer lagerstørrelsen fra 8 bytes, ned til enten 3, 4 eller 5 bytes (afhængigt af den præcision, du bruger i tiden værdi). Strengt taget tid bruger 4, 5 eller 6 byte, fordi en ekstra byte bruges til at gemme dens præcision.
Når du konverterer en datotid værdi til tid , kun tidsdelen af værdien kopieres. Det nøjagtige resultat vil afhænge af den brøkdelsekunders præcision, som du tildeler tid . Når tidspunktet præcision er mindre end datetime præcision rundes brøksekunderne op, så de passer til tiden præcision.
datoen datatypen har maksimalt 3 cifre for sin del af brøksekunder. Dens nøjagtighed er afrundet til trin på 0,000, 0,003 eller 0,007 sekunder.
tidspunktet datatype giver dig på den anden side mulighed for at angive en brøksekunders præcision fra 0 til 7. Dette opnås ved at bruge tiden(n ) syntaks, hvor n er skalaen fra 0 til 7. Hvis du ikke angiver dette, vil den bruge 7, hvilket giver en nøjagtighed på 100 nanosekunder.
Eksempel 1 – Implicit konvertering
Her er et eksempel på en implicit konvertering mellem datetime og 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 | +-------------------------+------------------+
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 datetime værdi til en tid variabel.
Det mest åbenlyse ved dette resultat er, at tiden værdien inkluderer ikke datoen. Dette er forventeligt, fordi tiden datatypen er udelukkende til lagring af tidsværdier, ikke datoværdier.
Vi kan også se, at tiden variabel har mere brøksekunders præcision, og vi ender med en brøkdel af 1233333 (i forhold til 123 for datetime værdi). Dette sker fordi tiden værdi bruger standardskalaen 7 (fordi vi ikke eksplicit har angivet en skala).
Eksempel 2 – Afrunding
datoen datatypen er afrundet til trin på 0,000, 003 eller 0,007 sekunder. Selvom du udtrykkeligt indstiller den til en anden værdi, bliver den afrundet.
Her er et eksempel:
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 dette eksempel satte jeg brøksekunderne til 125
men datotid rundede det op til
127
(fordi det kun kan afrundes til trin på 0,000, 003 eller 0,007 sekunder).
tidspunktet værdi skal du dog indstille brøksekunderne til 1266667 .
Hvis vi blot ville indstille startværdien til tid i første omgang ville dens brøkdel have returneret 1250000 .
Eksempel 3 – Præcision/nøjagtighed
Som nævnt er tiden datatype giver dig mulighed for at angive brøksekunders præcision. Hvis du ikke gør dette, bruger den 7 (derfor bruger det forrige eksempel 7).
Du kan ændre dette ved at bruge tiden(n ) syntaks. Derfor kunne jeg have brugt tid(7) for de foregående eksempler for at få det samme resultat.
I dette eksempel fjerner jeg brøksekunderne helt ved at bruge 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 dette, er lagerstørrelsen for tiden værdien reduceres til 3 bytes (4 bytes inklusive præcision) i modsætning til 8 bytes for datetime værdi.
Vær opmærksom på, at hvis du bruger en lavere præcision end den oprindelige værdi, vil resultatet blive rundet op, så det passer til den angivne præcision.
Eksempel:
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 | +-------------------------+----------+
Eksempel 4 – 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 for eksplicit at konvertere mellem dato og klokkeslæt og 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 | +-------------------------+-----------+
Eksempel 5 – 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 @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 | +-------------------------+-----------+