Tämä artikkeli sisältää esimerkkejä päivämäärän arvon muuntamisesta smalldatetime-arvoksi SQL Serverissä.
Kun muunnat päivämääräarvon smalldatetime-arvoksi, arvoon lisätään lisätietoja. Tämä johtuu siitä, että smalldatetime-tietotyyppi sisältää sekä päivämäärä- että aikatietoja. Päiväys-tietotyyppi sen sijaan sisältää vain päiväystietoja.
On kuitenkin tapauksia, joissa päivämäärän muuntaminen smalldatetime-arvoksi saattaa epäonnistua. Erityisesti jos päivämäärän arvo on smalldatetime-ohjelman tukeman alueen ulkopuolella, muuntaminen epäonnistuu virheilmoituksella.
Jokatapauksessa alla on esimerkkejä näiden kahden tietotyypin välisestä muuntamisesta.
Esimerkki 1 – Implisiittinen muuntaminen
Tässä on esimerkki implisiittisestä muuntamisesta päivämäärän ja smalldatetime-arvon välillä.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Tulos:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Tämä on implisiittinen muunnos, koska emme käytä muunnosfunktiota (kuten alla olevia) nimenomaiseen muuntamiseen. Tässä tapauksessa SQL Server suorittaa implisiittisen muunnoksen kulissien takana, kun yritämme määrittää päivämääräarvon smalldatetime-muuttujaan.
Voidaan nähdä, että date-muuttuja sisältää vain päivämäärätietoja, kun taas smalldatetime-muuttuja sisältää sekä päivämäärä- että aikatietoja.
Kun muunnat date- ja smalldatetime-muuttujan välillä, aikakomponentti asetetaan arvoon 00:00:00
. Näin saadaan minuutin tarkkuus.
Syy siihen, että kaikki nollat ovat nollia, johtuu siitä, että päivämäärän arvo ei sisällä mitään aikatietoja, joten SQL Server ei voi mitenkään tietää haluamaasi aikaa (jos sitä on).
Tämän tuloksen saat tietysti myös, vaikka yksinkertaisesti osoittaisit pelkän päivämäärän smalldatetime-arvolle suorittamatta muunnosta:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01'SELECT @thesmalldatetime AS 'smalldatetime';
Tulos:
+---------------------+| smalldatetime ||---------------------|| 2020-12-01 00:00:00 |+---------------------+
Esimerkki 2 – Ajan muokkaaminen
Jos sinun on määritettävä kellonaika (mutta säilytettävä sama päivämäärä), voit käyttää DATEADD()
-funktiota juuri siihen.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Tulos:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Esimerkki 3 – Eksplisiittinen muuntaminen käyttäen CAST()
Tässä on esimerkki eksplisiittisestä muuntamisesta. Tässä tapauksessa käytän CAST()
-funktiota suoraan SELECT
-lauseen sisällä muunnettaessa eksplisiittisesti päivämäärän ja smalldatetime-ajan välillä.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Tulos:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Sama tulos kuin implisiittisessä muunnoksessa.
Voidaan myös säätää aikaa näin:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Tulos:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Esimerkki 4 – Eksplisiittinen muunnos käyttäen CONVERT()
Tässä on esimerkki eksplisiittisestä muunnoksesta, jossa käytetään CONVERT()
-funktiota CAST()
:n sijaan.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Tulos:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Ja ajan mukauttaminen:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Tulos:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Esimerkki 5 – Out of Range -virhe
Kuten mainittiin, jos päiväys on smalldatetime-tietotyypin tukeman vaihteluvälin ulkopuolella, tulee virhe.
DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Tulos:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
Datatyyppi smalldatetime tukee vain päivämäärän vaihteluvälejä 1900-01-01-2079-06-06.
Seuraavasti smalldatetime-tietotyyppi tukee vain aika-alueita 00:00:00-23:59:59, joten saat myös virheen, jos yrität käyttää tämän alueen ulkopuolista arvoa (esimerkiksi suuremmalla tarkkuudella).
Esimerkki:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Tulos:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
Tässä tapauksessa kyse ei kuitenkaan ole virheestä muunnettaessa, vaan itse asiassa virheestä käytettäessä DATEADD()
-funktiota (koska funktio ei salli kyseisen päivämäärän käyttämistä smalldatetime-tietotyypissä).