Database.Guide

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).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.