Dit artikel bevat voorbeelden van het converteren van een datum waarde toe aan een smalldatetime waarde in SQL Server.
Wanneer u een datum converteert waarde voor smalldatetime , wordt er extra informatie aan de waarde toegevoegd. Dit komt omdat de smalldatetime gegevenstype bevat zowel datum- als tijdinformatie. De datum gegevenstype daarentegen bevat alleen datuminformatie.
Er zijn echter gevallen waarin een datum naar smalldatetime conversie kan mislukken. In het bijzonder, als de datum waarde ligt buiten het bereik dat wordt ondersteund door smalldatetime dan zal het mislukken met een fout.
Hieronder staan in ieder geval voorbeelden van conversie tussen deze twee datatypes.
Voorbeeld 1 – Impliciete conversie
Hier is een voorbeeld van een impliciete conversie tussen datum en smalldatetime .
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Resultaat:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
Dit is een impliciete conversie omdat we geen conversiefunctie (zoals hieronder) gebruiken om deze expliciet te converteren. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de datum toe te wijzen waarde toe aan een smalldatetime variabel.
We kunnen zien dat de datum variabele bevat alleen datuminformatie, terwijl de smalldatetime variabele bevat zowel datum- als tijdinformatie.
Wanneer u converteert tussen datum en smalldatetime , de tijdcomponent is ingesteld op 00:00:00
. Dit zorgt voor een nauwkeurigheid tot op de minuut.
De reden dat het allemaal nullen zijn, is omdat de datumwaarde geen tijdinformatie bevat, dus SQL Server kan op geen enkele manier weten hoe laat u wilt (indien aanwezig).
Natuurlijk krijgt u dit resultaat ook als u eenvoudig een datumwaarde toewijst aan een smalldatetime zonder een conversie uit te voeren:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01' SELECT @thesmalldatetime AS 'smalldatetime';
Resultaat:
+---------------------+ | smalldatetime | |---------------------| | 2020-12-01 00:00:00 | +---------------------+
Voorbeeld 2 – Wijzig de tijd
Als u een tijd moet opgeven (maar dezelfde datum wilt behouden), kunt u de DATEADD()
gebruiken functie om precies dat te doen.
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime) SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Resultaat:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Voorbeeld 3 – Expliciete conversie met CAST()
Hier is een voorbeeld van een expliciete conversie. In dit geval gebruik ik de CAST()
functie direct binnen de SELECT
statement om expliciet te converteren tussen datum en smalldatetime .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Resultaat:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
Hetzelfde resultaat als de impliciete conversie.
We kunnen de tijd ook als volgt aanpassen:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Resultaat:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Voorbeeld 4 – Expliciete conversie met CONVERT()
Hier is een voorbeeld van een expliciete conversie met de CONVERT()
functie in plaats van CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Resultaat:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
En de tijd aanpassen:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Resultaat:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Voorbeeld 5 – Fout buiten bereik
Zoals vermeld, als de datum buiten het bereik valt dat wordt ondersteund door de smalldatetime gegevenstype, krijgt u een foutmelding.
DECLARE @thedate date SET @thedate = '2080-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Resultaat:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
De smalldatetime gegevenstype ondersteunt alleen datumbereiken 1900-01-01 tot 2079-06-06.
Ook de smalldatetime gegevenstype ondersteunt alleen tijdbereiken van 00:00:00 tot 23:59:59, dus u krijgt ook een foutmelding als u een waarde buiten dat bereik probeert te gebruiken (bijvoorbeeld met een hogere precisie).
Voorbeeld:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Resultaat:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
In dit geval is het echter geen fout tijdens het converteren, het is eigenlijk een fout tijdens het gebruik van de DATEADD()
functie (omdat de functie niet toestaat dat bepaalde datepart wordt gebruikt op een smalldatetime gegevenstype).