Acest articol conține exemple de conversie a unei valori de dată într-o valoare smalldatetime în SQL Server.
Când convertiți o valoare de dată în smalldatetime, se adaugă informații suplimentare la valoare. Acest lucru se datorează faptului că tipul de date smalldatetime conține atât informații despre dată, cât și despre oră. Tipul de date date, pe de altă parte, conține numai informații despre dată.
Cu toate acestea, există cazuri în care o conversie din data în smalldatetime ar putea eșua. În special, dacă valoarea datei este în afara intervalului acceptat de smalldatetime, atunci va eșua cu o eroare.
În orice caz, mai jos sunt prezentate exemple de conversie între aceste două tipuri de date.
Exemplu 1 – Conversie implicită
Iată un exemplu de conversie implicită între date și smalldatetime.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Rezultat:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Aceasta este o conversie implicită pentru că nu folosim o funcție de conversie (precum cele de mai jos) pentru a o converti în mod explicit. În acest caz, SQL Server efectuează o conversie implicită în spatele scenei atunci când încercăm să atribuim valoarea datei la o variabilă smalldatetime.
Vezi că variabila date conține doar informații despre dată, în timp ce, variabila smalldatetime conține atât informații despre dată, cât și despre oră.
Când faceți conversia între date și smalldatetime, componenta de timp este setată la 00:00:00
. Acest lucru asigură o precizie la minut.
Motivul pentru care sunt toate zerourile este acela că valoarea datei nu conține nicio informație despre oră, astfel încât SQL Server nu are cum să știe ce oră doriți (dacă există).
Desigur, obțineți, de asemenea, acest rezultat chiar dacă atribuiți pur și simplu o valoare doar de dată la un smalldatetime fără a efectua o conversie:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01'SELECT @thesmalldatetime AS 'smalldatetime';
Rezultat:
+---------------------+| smalldatetime ||---------------------|| 2020-12-01 00:00:00 |+---------------------+
Exemplu 2 – Modificarea orei
Dacă aveți nevoie să specificați o oră (dar să păstrați aceeași dată), puteți utiliza funcția DATEADD()
pentru a face exact acest lucru.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Rezultat:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Exemplu 3 – Conversia explicită folosind CAST()
Iată un exemplu de conversie explicită. În acest caz, folosesc funcția CAST()
direct în cadrul instrucțiunii SELECT
pentru a converti explicit între date și smalldatetime.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Rezultat:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Același rezultat ca și în cazul conversiei implicite.
De asemenea, putem ajusta ora astfel:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Rezultat:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Exemplu 4 – Conversia explicită folosind CONVERT()
Iată un exemplu de conversie explicită folosind funcția CONVERT()
în loc de CAST()
.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Rezultat:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Și ajustarea orei:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Rezultat:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Exemplu 5 – Eroare de ieșire din interval
După cum am menționat, dacă data este în afara intervalului suportat de tipul de date smalldatetime, veți primi o eroare.
DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Rezultat:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
Tipul de date smalldatetime suportă doar intervalele de date 1900-01-01 până la 2079-06-06.
De asemenea, tipul de date smalldatetime suportă numai intervale de timp de la 00:00:00 la 23:59:59, astfel încât veți primi, de asemenea, o eroare dacă încercați să utilizați o valoare în afara acestui interval (de exemplu, cu o precizie mai mare).
Exemplu:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Rezultat:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
Cu toate acestea, în acest caz, nu este o eroare în timpul conversiei, este de fapt o eroare în timpul utilizării funcției DATEADD()
(deoarece funcția nu permite ca acea anumită parte de dată să fie utilizată pe un tip de date smalldatetime).
.