Ten artykuł zawiera przykłady konwersji data/godzina2 wartość do smalldatetime wartość w SQL Server.
Jedna z korzyści konwersji data/godzina2 wartość smalldatetime polega na zmniejszeniu rozmiaru pamięci z 7, 8 lub 9 bajtów do 4 bajtów. Tracisz jednak precyzję.
data/godzina2 typ danych umożliwia określenie dokładności ułamka sekundy od 0 do 7. Jeśli nie określisz tego, użyje 7 (wartość domyślna). Jeśli podasz zero (0
), jego dokładność będzie z dokładnością do najbliższej sekundy.
smalldatetime z drugiej strony typ danych nie ma żadnych ułamków sekund, a jego składnik sekund jest zawsze ustawiony na zero (:00). Jego dokładność jest do najbliższej minuty.
Po przekonwertowaniu data/godzina2 wartość smalldatetime , kopiowana jest data i część czasu. Składnik sekund jest ustawiony na zero (niezależnie od pierwotnej wartości składnika sekund), a czas jest zaokrąglany do najbliższej minuty. Wszelkie ułamki sekund są usuwane.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między datetime2 i smalldatetime .
DECLARE @thedatetime2 datetime2, @thesmalldatetime smalldatetime; SET @thedatetime2 = '2025-05-21 10:15:30.1234567'; SET @thesmalldatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thesmalldatetime AS 'smalldatetime';
Wynik:
+-----------------------------+---------------------+ | datetime2 | smalldatetime | |-----------------------------+---------------------| | 2025-05-21 10:15:30.1234567 | 2025-05-21 10:16:00 | +-----------------------------+---------------------+
Jest to niejawna konwersja, ponieważ nie używamy funkcji konwersji (takich jak te poniżej) do jawnej konwersji. W tym przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać datetime2 wartość do smalldatetime zmienna.
W tym przykładzie widzimy, że smalldatetime wartość nie obejmuje ułamków sekund, sekundy zostały ustawione na zero, a minuty zostały zaokrąglone w górę.
W tym przypadku datetime2 wartość używa precyzji 7. Dzieje się tak, ponieważ 7 jest wartością domyślną. Nie określiłem precyzji i dlatego użyto wartości domyślnej.
Ale dałoby to ten sam wynik, niezależnie od wybranej przeze mnie precyzji. Nawet gdybym zredukował go do zera (tj. zadeklarował jako datetime2(0)
), i tak zwróciłby ten sam wynik.
Przykład 2 – 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 datetime2 i smalldatetime .
DECLARE @thedatetime2 datetime2(0); SET @thedatetime2 = '2025-05-21 10:15:30'; SELECT @thedatetime2 AS 'datetime2', CAST(@thedatetime2 AS smalldatetime) AS 'smalldatetime';
Wynik:
+---------------------+---------------------+ | datetime2 | smalldatetime | |---------------------+---------------------| | 2025-05-21 10:15:30 | 2025-05-21 10:16:00 | +---------------------+---------------------+
W tym przykładzie zdecydowałem się użyć skali zerowej dla datetime2 wartość (np. datetime2(0)
), jednak nie ma to wpływu na wynikowy smalldatetime wartość.
Przykład 3 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład jawnej konwersji przy użyciu CONVERT()
funkcja zamiast CAST()
.
DECLARE @thedatetime2 datetime2(0); SET @thedatetime2 = '2025-05-21 10:15:30'; SELECT @thedatetime2 AS 'datetime2', CONVERT(smalldatetime, @thedatetime2) AS 'smalldatetime';
Wynik:
+---------------------+---------------------+ | datetime2 | smalldatetime | |---------------------+---------------------| | 2025-05-21 10:15:30 | 2025-05-21 10:16:00 | +---------------------+---------------------+