Ten artykuł zawiera przykłady konwersji wartości date na wartość smalldatetime w SQL Server.
Gdy konwertujesz wartość daty na smalldatetime, do wartości dodawane są dodatkowe informacje. Dzieje się tak, ponieważ typ danych smalldatetime zawiera zarówno informacje o dacie, jak i czasie. Typ danych date, z drugiej strony, zawiera tylko informacje o dacie.
Jednakże istnieją przypadki, w których konwersja daty na smalldatetime może zakończyć się niepowodzeniem. W szczególności, jeśli wartość daty znajduje się poza zakresem obsługiwanym przez smalldatetime, wówczas konwersja zakończy się niepowodzeniem z błędem.
W każdym razie, poniżej znajdują się przykłady konwersji między tymi dwoma typami danych.
Przykład 1 – Konwersja niejawna
Tutaj znajduje się przykład niejawnej konwersji między datą a smalldatetime.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Result:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Jest to konwersja niejawna, ponieważ nie używamy funkcji konwersji (jak te poniżej) do jawnej konwersji. W tym przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać wartość daty do zmiennej smalldatetime.
Widzimy, że zmienna date zawiera tylko informacje o dacie, podczas gdy zmienna smalldatetime zawiera zarówno informacje o dacie, jak i o czasie.
Podczas konwersji pomiędzy datą a smalldatetime, składnik czasu jest ustawiony na 00:00:00
. Zapewnia to dokładność do minuty.
Powodem, dla którego są to same zera, jest to, że wartość daty nie zawiera żadnych informacji o czasie, więc nie ma sposobu, aby SQL Server wiedział, jaki czas chcesz (jeśli w ogóle).
Oczywiście, taki wynik otrzymasz również wtedy, gdy po prostu przypiszesz wartość tylko daty do smalldatetime bez wykonywania konwersji:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01'SELECT @thesmalldatetime AS 'smalldatetime';
Wynik:
+---------------------+| smalldatetime ||---------------------|| 2020-12-01 00:00:00 |+---------------------+
Przykład 2 – Modyfikacja czasu
Jeśli musisz określić czas (ale zachować tę samą datę), możesz użyć funkcji DATEADD()
, aby to zrobić.
DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime)SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Result:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Przykład 3 – Jawna konwersja przy użyciu funkcji CAST()
Oto przykład jawnej konwersji. W tym przypadku, używam funkcji CAST()
bezpośrednio w instrukcji SELECT
do jawnej konwersji między datą a czasem przeszłym (smalldatetime).
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Wynik:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
Ten sam wynik, co w przypadku konwersji niejawnej.
Możemy również ustawić czas w ten sposób:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Wynik:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Przykład 4 – Konwersja jawna przy użyciu funkcji CONVERT()
Przykład konwersji jawnej przy użyciu funkcji CONVERT()
zamiast CAST()
.
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', CONVERT(smalldatetime, @thedate) AS 'smalldatetime';
Wynik:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+
I dostosowując czas:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Wynik:
+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 07:00:00 |+------------+---------------------+
Przykład 5 – Błąd poza zakresem
Jak wspomniano, jeśli data jest poza zakresem obsługiwanym przez typ danych smalldatetime, otrzymasz błąd.
DECLARE @thedate dateSET @thedate = '2080-12-01'SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Result:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
Typ danych smalldatetime obsługuje tylko zakresy dat od 1900-01-01 do 2079-06-06.
Typ danych smalldatetime obsługuje również zakresy czasowe od 00:00:00 do 23:59:59, więc otrzymasz błąd, jeśli spróbujesz użyć wartości spoza tego zakresu (na przykład z większą precyzją).
Przykład:
DECLARE @thedate dateSET @thedate = '2020-12-01'SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Wynik:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
Jednakże w tym przypadku nie jest to błąd podczas konwersji, jest to faktycznie błąd podczas używania funkcji DATEADD()
(ponieważ funkcja nie pozwala na użycie tego konkretnego datepartu na typie danych smalldatetime).