sql >> Database >  >> RDS >> Sqlserver

datetime vs smalldatetime in SQL Server:wat is het verschil?

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               |
+------------+-----------------+

  1. Een database-e-mailaccount verwijderen uit een profiel (SSMS)

  2. Waarde van primaire sleutel bijwerken met entiteitsraamwerk

  3. Hoe de identiteitskolom in SQL Server bij te werken?

  4. Voer productanalyses uit met behulp van SQL Server Full-Text Search. Deel 1