Dit artikel bevat voorbeelden van het converteren van een datetime waarde tot een tijd waarde in SQL Server.
Een van de voordelen van het converteren van een datetime waarde tot tijd is dat u de opslaggrootte verkleint van 8 bytes tot 3, 4 of 5 bytes (afhankelijk van de precisie die u gebruikt voor de tijd waarde). Strikt genomen, tijd gebruikt 4, 5 of 6 bytes, omdat er een extra byte wordt gebruikt om de precisie op te slaan.
Wanneer u een datetime . converteert waarde tot tijd , wordt alleen het tijdsgedeelte van de waarde gekopieerd. Het exacte resultaat hangt af van de precisie van een fractie van een seconde die u toewijst aan tijd . Wanneer de tijd precisie is minder dan de datetime precisie, de fractionele seconden worden naar boven afgerond zodat ze passen bij de tijd precisie.
De datetime gegevenstype heeft een maximum van 3 cijfers voor het gedeelte met breuken in seconden. De nauwkeurigheid wordt afgerond op stappen van .000, .003 of .007 seconden.
De tijd Met het gegevenstype daarentegen kunt u een precisie van een fractie van een seconde specificeren van 0 tot 7. Dit wordt bereikt door de time(n) ) syntaxis, waarbij n is de schaal van 0 tot 7. Als u dit niet opgeeft, gebruikt het 7, wat zorgt voor een nauwkeurigheid van 100 nanoseconden.
Voorbeeld 1 – Impliciete conversie
Hier is een voorbeeld van een impliciete conversie tussen datetime en tijd .
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Resultaat:
+-------------------------+------------------+ | datetime | time | |-------------------------+------------------| | 2025-05-21 10:15:30.123 | 10:15:30.1233333 | +-------------------------+------------------+
Dit is een impliciete conversie omdat we geen conversiefunctie (zoals hieronder) gebruiken om deze expliciet te converteren. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de datetime toe te wijzen waarde tot een tijd variabel.
Het meest voor de hand liggende aan dit resultaat is dat de tijd waarde is exclusief de datum. Dit is te verwachten, omdat de tijd gegevenstype is uitsluitend bedoeld voor het opslaan van tijdwaarden, niet voor datumwaarden.
We kunnen ook zien dat de tijd variabele heeft meer fractionele seconden precisie, en we eindigen met een fractioneel deel van 1233333 (vs 123 voor de datetime waarde). Dit gebeurt omdat de tijd waarde gebruikt de standaardschaal van 7 (omdat we niet expliciet een schaal hebben gespecificeerd).
Voorbeeld 2 – Afronding
De datetime gegevenstype wordt afgerond op stappen van .000, .003 of .007 seconden. Zelfs als u het expliciet op een andere waarde instelt, wordt het afgerond.
Hier is een voorbeeld:
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'thetime';
Resultaat:
+-------------------------+------------------+ | datetime | thetime | |-------------------------+------------------| | 2025-05-21 10:15:30.127 | 10:15:30.1266667 | +-------------------------+------------------+
In dit voorbeeld stel ik de fractionele seconden in op 125
maar datetime afgerond op
127
(omdat het alleen kan worden afgerond op stappen van .000, .003 of .007 seconden).
De tijd waarde, stel de fractionele seconden echter in op 1266667 .
Als we de beginwaarde gewoon hadden ingesteld op time in de eerste plaats zou het fractionele deel ervan 1250000 hebben geretourneerd .
Voorbeeld 3 – Precisie/nauwkeurigheid
Zoals gezegd, de tijd Met het gegevenstype kunt u de precisie van fractionele seconden specificeren. Als u dit niet doet, gebruikt het 7 (daarom gebruikt het vorige voorbeeld 7).
U kunt dit wijzigen door de time(n ) syntaxis. Daarom had ik time(7) . kunnen gebruiken voor de vorige voorbeelden om hetzelfde resultaat te krijgen.
In dit voorbeeld verwijder ik de fractionele seconden helemaal door time(0) . te gebruiken :
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';
Resultaat:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+----------+
Wanneer we dit doen, wordt de opslaggrootte van de tijd waarde wordt teruggebracht tot 3 bytes (4 bytes inclusief precisie) in plaats van 8 bytes voor de datetime waarde.
Houd er rekening mee dat het gebruik van een lagere precisie dan de oorspronkelijke waarde ertoe leidt dat het resultaat naar boven wordt afgerond om aan de opgegeven precisie te voldoen.
Voorbeeld:
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';
Resultaat:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.527 | 10:15:31 | +-------------------------+----------+
Voorbeeld 4 – Expliciete conversie met CAST()
Hier is een voorbeeld van een expliciete conversie. In dit geval gebruik ik de CAST()
functie direct binnen de SELECT
statement om expliciet te converteren tussen datetime en tijd .
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS time(0)) AS 'time(0)';
Resultaat:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+
Voorbeeld 5 – Expliciete conversie met CONVERT()
Hier is een voorbeeld van een expliciete conversie met de CONVERT()
functie in plaats van CAST()
.
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(time(0), @thedatetime) AS 'time(0)';
Resultaat:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+