Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

datetime vs smalldatetime in SQL Server:Was ist der Unterschied?

In diesem Artikel werden die Hauptunterschiede zwischen datetime untersucht und smalldatetime Datentypen in SQL Server.

Beide Datentypen werden zum Speichern von Datums- und Uhrzeitwerten verwendet, es gibt jedoch Unterschiede zwischen den beiden. In den meisten Fällen ist es besser, beide Arten zu vermeiden und datetime2 zu verwenden stattdessen (Microsoft empfiehlt dies auch). Auf jeden Fall finden Sie hier einen Vergleich dieser beiden Datentypen.

Die folgende Tabelle zeigt einige wichtige Ähnlichkeiten und Unterschiede zwischen diesen beiden Datentypen.

Funktion smalldatetime datetime
SQL-konform (ANSI &ISO 8601) Nein Nein
Zeitraum 1.1.1900 bis 6.6.2079 1753-01-01 bis 9999-12-31
Zeitbereich 00:00:00 bis 23:59:59 00:00:00 bis 23:59:59.997
Zeichenlänge Maximal 19 Positionen mindestens 19 Positionen
maximal 23
Speichergröße 4 Byte, fest 8 Bytes, fest
Genauigkeit Eine Minute Gerundet auf 0,000, 0,003 oder 0,007 Sekunden
Präzision auf Sekundenbruchteile Nein Ja
Benutzerdefinierte Genauigkeit für Sekundenbruchteile Nein Nein
Zeitzonenverschiebung Keine Keine
Bewusstsein und Erhaltung der Zeitzonenverschiebung Nein Nein
Sommerzeit bewusst Nein Nein

Soll ich „datetime“ oder „smalldatetime“ verwenden?

Microsoft rät davon ab, diese beiden Datentypen für neue Arbeiten zu verwenden. Sie sollten sie nur verwenden, wenn Sie einen triftigen Grund dazu haben.

Aber wenn Sie sich entscheiden müssten, würden Sie Ihre Entscheidung wahrscheinlich treffen, indem Sie die zusätzliche Genauigkeit und Genauigkeit von datetime abwägen gegenüber den geringeren Speicheranforderungen von smalldatetime .

Mit anderen Worten, wenn Sie keine Sekundengenauigkeit benötigen, smalldatetime wird die Arbeit erledigen und dabei nur die Hälfte des Speicherplatzes beanspruchen. Wenn Sie andererseits eine Genauigkeit von Sekunden (oder sogar Sekundenbruchteilen) benötigen, müssen Sie datetime verwenden .

Microsoft empfiehlt in jedem Fall die Verwendung von date , Zeit , datetime2 , oder datetimeoffset für neue Arbeit.

Siehe smalldatetime vs. datetime2 und datetime vs. datetime2 um zu sehen, wie jeder dieser Typen mit datetime2 verglichen wird .

Beispiel 1 – Grundlegender Vergleich

Hier ist ein kurzes Beispiel, um den grundlegenden Unterschied zwischen datetime zu demonstrieren und 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';

Ergebnis:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Hier setze ich eine smalldatetime Variable auf den gleichen Wert wie datetime Variable. Dadurch wird der Wert in smalldatetime umgewandelt und wir können dann ein SELECT verwenden -Anweisung, um den tatsächlichen Wert anzuzeigen, der jeder Variablen zugewiesen wurde.

In diesem Fall runden beide Variablen den Wert auf. Aber sie werden anders aufgerundet.

Die datetime Variable rundet den Sekundenbruchteil auf. Das liegt daran, dass datetime rundet immer in Schritten von 0,000, 0,003 oder 0,007 Sekunden.

Die smalldatetime Variable hingegen rundet die Minuten auf Teil. Außerdem wird der Sekundenteil auf Null gesetzt. Dies ist zu erwarten, da die offizielle Dokumentation von Microsoft besagt, dass smalldatetime Die Uhrzeit ist …basierend auf einem 24-Stunden-Tag, mit Sekunden immer Null (:00) und ohne Sekundenbruchteile .

Wir können also sehen, dass die datetime type liefert einen genaueren und genaueren Datums-/Uhrzeitwert.

Beispiel 2 – Setzen von Werten aus String-Literalen

In den vorherigen Beispielen wurde die smalldateime value wurde zugewiesen, indem es auf den gleichen Wert wie datetime gesetzt wurde Wert. Wenn wir das tun, führt SQL Server eine implizite Konvertierung durch, damit die Daten dem neuen Datentyp „passen“.

Wie sich herausstellt, können wir auch die smalldatetime setzen Variable in dasselbe Zeichenfolgenliteral, das Sekundenbruchteile enthält (auch wenn dieser Datentyp keine Sekundenbruchteile speichert).

Hier ist ein Beispiel, wo ich genau das mache:

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';

Ergebnis:

+-------------------------+---------------------+
| datetime                | smalldatetime       |
|-------------------------+---------------------|
| 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 |
+-------------------------+---------------------+

Natürlich ist das Ergebnis dasselbe, wenn wir die Werte auswählen – die smalldatetime Der Wert zeigt keine Sekundenbruchteile, die Sekunden sind Null und die Minuten werden aufgerundet.

Wenn wir jedoch mehr als 3 Dezimalstellen verwenden, geben beide Datentypen einen Fehler zurück.

Fehler für 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';

Ergebnis:

Msg 241, Level 16, State 1, Line 4
Conversion failed when converting date and/or time from character string.

Fehler für 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';

Ergebnis:

Msg 295, Level 16, State 3, Line 5
Conversion failed when converting character string to smalldatetime data type.

Beispiel 3 – Speichergröße

Die smalldatetime Datentyp hat eine feste Speichergröße von 4 Bytes. Dies ist einer der wenigen Vorteile von smalldatetime hat über datetime , die eine feste Speichergröße von 8 Bytes hat.

Wir können die Speichergröße mit DATALENGTH() überprüfen Funktion, um die Anzahl der Bytes zurückzugeben, die für jeden unserer Werte verwendet werden:

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';

Ergebnis

+------------+-----------------+
| datetime   | smalldatetime   |
|------------+-----------------|
| 8          | 4               |
+------------+-----------------+

Dasselbe Ergebnis erhalten wir auch, wenn wir sie in varbinary umwandeln , was repräsentativer dafür ist, wie sie tatsächlich in der Datenbank gespeichert sind:

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';

Ergebnis

+------------+-----------------+
| datetime   | smalldatetime   |
|------------+-----------------|
| 8          | 4               |
+------------+-----------------+