Ten artykuł zawiera przykłady konwersji daty wartość do smalldatetime wartość w SQL Server.
Po przekonwertowaniu daty wartość smalldatetime , dodatkowe informacje są dodawane do wartości. Dzieje się tak, ponieważ smalldatetime typ danych zawiera zarówno informacje o dacie, jak i godzinie. data z drugiej strony typ danych zawiera tylko informacje o dacie.
Istnieją jednak przypadki, w których data do smalldatetime konwersja może się nie powieść. W szczególności, jeśli data wartość jest poza zakresem obsługiwanym przez smalldatetime wtedy zawiedzie 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
Oto przykład niejawnej konwersji między data i smalldatetime .
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Wynik:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
Jest to niejawna konwersja, ponieważ nie używamy funkcji konwersji (takich jak te poniżej) do jawnej konwersji. W takim przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać datę wartość do smalldatetime zmienna.
Widzimy, że data zmienna zawiera tylko informacje o dacie, natomiast smalldatetime zmienna zawiera zarówno informacje o dacie, jak i godzinie.
Podczas konwersji między datą i smalldatetime , składnik czasu jest ustawiony na 00:00:00
. Zapewnia to dokładność co do minuty.
Powodem, dla którego wszystkie są zerami, jest to, że wartość daty nie zawiera żadnych informacji o czasie, więc SQL Server nie ma możliwości dowiedzenia się, o której godzinie chcesz (jeśli w ogóle).
Oczywiście otrzymasz ten wynik, nawet jeśli po prostu przypiszesz wartość zawierającą tylko datę 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 potrzebujesz określić godzinę (ale zachować tę samą datę), możesz użyć DATEADD()
funkcja właśnie to zrobić.
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';
Wynik:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Przykład 3 – Jawna konwersja za pomocą CAST()
Oto przykład jawnej konwersji. W tym przypadku używam CAST()
działać bezpośrednio w SELECT
oświadczenie o jawnej konwersji między datą i smalldatetime .
DECLARE @thedate date SET @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 niejawna konwersja.
Możemy również dostosować czas w ten sposób:
DECLARE @thedate date SET @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 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład jawnej konwersji przy użyciu CONVERT()
funkcja zamiast CAST()
.
DECLARE @thedate date SET @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 dostosowanie czasu:
DECLARE @thedate date SET @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 wykracza poza zakres obsługiwany przez smalldatetime typ danych, pojawi się błąd.
DECLARE @thedate date SET @thedate = '2080-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Wynik:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
smalldatetime typ danych obsługuje tylko zakresy dat od 1900-01-01 do 2079-06-06.
Ponadto smalldatetime typ danych obsługuje tylko zakresy czasu od 00:00:00 do 23:59:59, więc jeśli spróbujesz użyć wartości spoza tego zakresu (na przykład z większą precyzją), również wystąpi błąd.
Przykład:
DECLARE @thedate date SET @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 w tym przypadku nie jest to błąd podczas konwersji, w rzeczywistości jest to błąd podczas korzystania z DATEADD()
funkcja (ponieważ funkcja nie pozwala na użycie tej konkretnej części daty w smalldatetime typ danych).