Dieser Artikel enthält Beispiele für die Konvertierung eines Datumswertes in einen smalldatetime-Wert in SQL Server.
Wenn Sie einen Datumswert in smalldatetime konvertieren, werden dem Wert zusätzliche Informationen hinzugefügt. Das liegt daran, dass der Datentyp smalldatetime sowohl Datums- als auch Zeitinformationen enthält. Der Datentyp date hingegen enthält nur Datumsinformationen.
Es gibt jedoch Fälle, in denen eine Konvertierung von date in smalldatetime fehlschlagen kann. Insbesondere, wenn der Datumswert außerhalb des von smalldatetime unterstützten Bereichs liegt, schlägt die Konvertierung mit einem Fehler fehl.
Nachfolgend finden Sie auf jeden Fall Beispiele für die Konvertierung zwischen diesen beiden Datentypen.
Beispiel 1 – Implizite Konvertierung
Hier ist ein Beispiel für eine implizite Konvertierung zwischen Datum und smalldatetime.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Ergebnis:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Dies ist eine implizite Konvertierung, da wir keine Konvertierungsfunktion (wie die folgenden) verwenden, um sie explizit zu konvertieren. In diesem Fall führt SQL Server eine implizite Konvertierung hinter den Kulissen durch, wenn wir versuchen, den Datumswert einer smalldatetime-Variablen zuzuweisen.
Wir können sehen, dass die Datumsvariable nur Datumsinformationen enthält, während die smalldatetime-Variable sowohl Datums- als auch Zeitinformationen enthält.
Bei der Konvertierung zwischen date und smalldatetime wird die Zeitkomponente auf 00:00:00
gesetzt. Dies sorgt für eine Genauigkeit auf die Minute genau.
Der Grund für die Nullen ist, dass der Datumswert keine Zeitinformationen enthält, so dass SQL Server keine Möglichkeit hat, die gewünschte Zeit (wenn überhaupt) zu ermitteln.
Natürlich erhalten Sie dieses Ergebnis auch, wenn Sie einfach einen reinen Datumswert einer smalldatetime zuweisen, ohne eine Konvertierung durchzuführen:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01'SELECT @thesmalldatetime AS 'smalldatetime';
Ergebnis:
+---------------------+| smalldatetime ||---------------------|| 2020-12-01 00:00:00 |+---------------------+
Beispiel 2 – Ändern der Zeit
Wenn Sie eine Zeit angeben müssen (aber das gleiche Datum beibehalten), können Sie die Funktion DATEADD()
verwenden, um genau das zu tun.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Ergebnis:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Beispiel 3 – Explizite Konvertierung mit CAST()
Hier ist ein Beispiel für eine explizite Konvertierung. In diesem Fall verwende ich die Funktion CAST()
direkt innerhalb der SELECT
-Anweisung, um explizit zwischen Datum und smalldatetime zu konvertieren.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Ergebnis:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Das gleiche Ergebnis wie bei der impliziten Konvertierung.
Wir können auch die Zeit wie folgt anpassen:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Ergebnis:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Beispiel 4 – Explizite Konvertierung mit CONVERT()
Hier ist ein Beispiel für eine explizite Konvertierung unter Verwendung der Funktion CONVERT()
anstelle von CAST()
.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Ergebnis:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Und Anpassen der Zeit:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Ergebnis:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Beispiel 5 – Out of Range Error
Wie bereits erwähnt, erhalten Sie einen Fehler, wenn das Datum außerhalb des vom Datentyp smalldatetime unterstützten Bereichs liegt.
DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Ergebnis:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
Der Datentyp smalldatetime unterstützt nur die Datumsbereiche 1900-01-01 bis 2079-06-06.
Außerdem unterstützt der Datentyp smalldatetime nur die Zeitbereiche 00:00:00 bis 23:59:59, so dass Sie auch einen Fehler erhalten, wenn Sie versuchen, einen Wert außerhalb dieses Bereichs zu verwenden (z. B. mit einer höheren Genauigkeit).
Beispiel:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Ergebnis:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
In diesem Fall handelt es sich jedoch nicht um einen Fehler bei der Konvertierung, sondern um einen Fehler bei der Verwendung der Funktion DATEADD()
(weil die Funktion nicht zulässt, dass dieser bestimmte Datumsabschnitt für einen smalldatetime-Datentyp verwendet wird).