Dit artikel bevat voorbeelden van het omzetten van een datumwaarde naar een smalldatetime waarde in SQL Server.
Wanneer u een datumwaarde converteert naar smalldatetime, wordt extra informatie aan de waarde toegevoegd. Dit komt omdat het smalldatetime datatype zowel datum- als tijdinformatie bevat. Het datatype date daarentegen bevat alleen datuminformatie.
Echter, er zijn gevallen waarin een conversie van date naar smalldatetime kan mislukken. In het bijzonder, als de datum waarde buiten het bereik ondersteund door smalldatetime dan zal mislukken met een fout.
In elk geval staan hieronder voorbeelden van conversie tussen deze twee gegevenstypen.
Voorbeeld 1 – Impliciete conversie
Hier volgt een voorbeeld van een impliciete conversie tussen datum en smalldatetime.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @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 gebruiken (zoals de onderstaande) om het expliciet om te zetten. In dit geval voert SQL Server achter de schermen een impliciete conversie uit wanneer we proberen de datumwaarde toe te wijzen aan een smalldatetime variabele.
We kunnen zien dat de datumvariabele alleen datuminformatie bevat, terwijl de smalldatetime variabele zowel datum- als tijdinformatie bevat.
Bij de omrekening tussen datum en smalldatetime wordt de tijdcomponent op 00:00:00
gezet. Dit zorgt voor een nauwkeurigheid tot op de minuut.
De reden dat het allemaal nullen zijn, is dat de datumwaarde geen tijdinformatie bevat, zodat SQL Server op geen enkele manier kan weten welke tijd u wilt (als die er al is).
Natuurlijk krijgt u dit resultaat ook als u eenvoudig een waarde die alleen de datum bevat aan een smalldatetime toewijst 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 specificeren (maar dezelfde datum moet behouden), kunt u de functie DATEADD()
gebruiken om precies dat te doen.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Resultaat:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Exemplaar 3 – Expliciete conversie met behulp van CAST()
Hier volgt een voorbeeld van een expliciete conversie. In dit geval gebruik ik de CAST()
functie direct in het SELECT
statement om expliciet te converteren tussen datum en smalldatetime.
DECLARE @thedate dateSET @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 bij de impliciete conversie.
We kunnen de tijd ook zo aanpassen:
DECLARE @thedate dateSET @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 |+------------+---------------------+
Exemplaar 4 – Expliciete conversie met CONVERT()
Hier volgt een voorbeeld van een expliciete conversie met de functie CONVERT()
in plaats van CAST()
.
DECLARE @thedate dateSET @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 dateSET @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 – Out of Range Error
Zoals gezegd, als de datum buiten het bereik valt dat door het smalldatetime datatype wordt ondersteund, krijgt u een fout.
DECLARE @thedate dateSET @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.
Het gegevenstype smalldatetime ondersteunt alleen de datumbereiken 1900-01-01 tot en met 2079-06-06.
Ook ondersteunt het smalldatetime datatype 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).
Exemplaar:
DECLARE @thedate dateSET @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.
Hoewel, in dit geval is het geen fout tijdens het converteren, maar een fout tijdens het gebruik van de DATEADD()
functie (omdat de functie niet toestaat dat dat specifieke datepart gebruikt wordt op een smalldatetime datatype).