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