Dit artikel onderzoekt de belangrijkste verschillen tussen de datetime en smalldatetime gegevenstypen in SQL Server.
Beide gegevenstypen worden gebruikt voor het opslaan van datum- en tijdwaarden, maar er zijn verschillen tussen de twee. In de meeste gevallen kunt u beide typen beter vermijden en datetime2 . gebruiken in plaats daarvan (Microsoft raadt dit ook aan). Hier is in ieder geval een vergelijking van deze twee gegevenstypen.
De volgende tabel geeft een overzicht van enkele belangrijke overeenkomsten en verschillen tussen deze twee gegevenstypen.
Functie | smalldatetime | datetime |
---|---|---|
SQL-compatibel (ANSI &ISO 8601) | Nee | Nee |
Datumbereik | 1900-01-01 tot 2079-06-06 | 1753-01-01 tot 9999-12-31 |
Tijdbereik | 00:00:00 tot 23:59:59 | 00:00:00 tot 23:59:59.997 |
Tekenlengte | 19 posities maximum | 19 posities minimaal 23 maximaal |
Opslaggrootte | 4 bytes, vast | 8 bytes, vast |
Nauwkeurigheid | Eén minuut | Afgerond op stappen van .000, .003 of .007 seconden |
Fractionele tweede precisie | Nee | Ja |
Door gebruiker gedefinieerde precisie van fractionele seconden | Nee | Nee |
Tijdzoneverschuiving | Geen | Geen |
Bewustwording en behoud van tijdzoneverschuiving | Nee | Nee |
Bewust zomertijd | Nee | Nee |
Moet ik 'datetime' of 'smalldatetime' gebruiken?
Microsoft raadt het gebruik van beide gegevenstypen af voor nieuw werk. Je mag ze alleen gebruiken als je daar een sterke reden voor hebt.
Maar als u moest kiezen, zou uw beslissing waarschijnlijk worden genomen door de extra precisie en nauwkeurigheid van datetime af te wegen. vs de lagere opslagvereisten van smalldatetime .
Met andere woorden, als u geen nauwkeurigheid tot op de seconde nodig heeft, smalldatetime zal het werk doen terwijl u slechts de helft van de opslagruimte gebruikt. Aan de andere kant, als je nauwkeurigheid tot op de seconden nodig hebt (of zelfs enkele fractionele seconden), dan moet je datetime gebruiken .
Microsoft raadt in ieder geval aan om date . te gebruiken , tijd , datetime2 , of datetimeoffset voor nieuw werk.
Zie smalldatetime vs datetime2 en datetime vs datetime2 om te zien hoe elk van deze typen zich verhoudt tot datetime2 .
Voorbeeld 1 – Basisvergelijking
Hier is een snel voorbeeld om het fundamentele verschil te demonstreren tussen datetime en smalldatetime .
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Resultaat:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Hier stel ik een smalldatetime in variabele naar dezelfde waarde als de datetime variabel. Hierdoor wordt de waarde geconverteerd naar smalldatetime en we kunnen dan een SELECT
. gebruiken statement om de werkelijke waarde te zien die aan elke variabele is toegewezen.
In dit geval ronden beide variabelen de waarde naar boven af. Maar ze zijn anders afgerond.
De datetime variabele rondt het deel van de fractionele seconden af. Dit komt omdat datetime rondt altijd af op stappen van .000, .003 of .007 seconden.
De smalldatetime variabele daarentegen rondt de minuten naar boven af deel. Niet alleen dat, het secondengedeelte wordt op nul gezet. Dit is te verwachten, omdat in de officiële documentatie van Microsoft staat dat smalldatetime
's tijd is ...gebaseerd op een dag van 24 uur, met seconden altijd nul (:00) en zonder fracties van seconden
.
We kunnen dus zien dat de datetime type biedt een nauwkeurigere en nauwkeurigere datum/tijd-waarde.
Voorbeeld 2 – Waarden instellen op basis van tekenreeksen
In de vorige voorbeelden is de smalldatetime waarde is toegewezen door deze op dezelfde waarde in te stellen als de datetime waarde. Wanneer we dat doen, voert SQL Server een impliciete conversie uit zodat de gegevens "passen" in het nieuwe gegevenstype.
Het blijkt dat we ook de smalldatetime . kunnen instellen variabele naar dezelfde letterlijke tekenreeks die fractionele seconden bevat (ook al slaat dit gegevenstype geen fractionele seconden op).
Hier is een voorbeeld waarin ik precies dat doe:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = '2025-05-21 10:15:30.555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Resultaat:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Het resultaat is natuurlijk hetzelfde als we de waarden selecteren - de smalldatetime waarde toont geen fractionele seconden, de seconden zijn nul en de minuten worden naar boven afgerond.
Als we echter meer dan 3 decimalen gebruiken, zullen beide gegevenstypen een fout retourneren.
Fout voor datetime :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Resultaat:
Msg 241, Level 16, State 1, Line 4 Conversion failed when converting date and/or time from character string.
Fout voor smalldatetime :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Resultaat:
Msg 295, Level 16, State 3, Line 5 Conversion failed when converting character string to smalldatetime data type.
Voorbeeld 3 – Opslaggrootte
De smalldatetime datatype heeft een vaste opslaggrootte van 4 bytes. Dit is een van de weinige voordelen smalldatetime heeft meer dan datetime , met een vaste opslaggrootte van 8 bytes.
We kunnen de opslaggrootte controleren met behulp van de DATALENGTH()
functie om het aantal bytes terug te geven dat voor elk van onze waarden is gebruikt:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(@thedatetime) AS 'datetime', DATALENGTH(@thesmalldatetime) AS 'smalldatetime';
Resultaat
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+
We krijgen ook hetzelfde resultaat, zelfs als we ze converteren naar varbinary , wat meer representatief is voor hoe ze daadwerkelijk in de database zijn opgeslagen:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(CAST(@thedatetime AS varbinary(10))) AS 'datetime', DATALENGTH(CAST(@thesmalldatetime AS varbinary(10))) AS 'smalldatetime';
Resultaat
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+