Ten artykuł zawiera przykłady konwersji przesunięcia daty i godziny wartość smalldatetime w SQL Server.
Kiedy konwertujesz przesunięcie daty i godziny wartość smalldatetime , kopiowana jest data i godziny. Minuty są zaokrąglane w górę (w zależności od wartości sekund), a sekundy są ustawiane na 0.
przesunięcie daty i godziny typ danych pozwala określić precyzję ułamków sekund od 0 do 7. Jest to realizowane za pomocą datetimeoffset(n)
składnia. Jeśli tego nie określisz, użyje 7 (domyślnie). Ma również przesunięcie strefy czasowej. Rozmiar pamięci tego typu danych wynosi 8, 9 lub 10 bajtów (plus 1 bajt na precyzję), w zależności od używanej precyzji.
smalldatetime z drugiej strony typ danych nie ma świadomości strefy czasowej, a zatem nie obejmuje żadnego przesunięcia strefy czasowej. Nie ma również żadnych ułamków sekund, a jego składnik sekund jest zawsze ustawiony na zero (:00). Jego dokładność jest do najbliższej minuty. Rozmiar pamięci tego typu danych jest ustalony na 4 bajty.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między przesunięciem daty i godziny i smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset, @thesmalldatetime smalldatetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SET @thesmalldatetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thesmalldatetime AS 'smalldatetime';
Wynik:
+------------------------------------+---------------------+ | datetimeoffset | smalldatetime | |------------------------------------+---------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 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 takim przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać przesunięcie daty i godziny wartość do smalldatetime zmienna.
Widzimy, że smalldatetime zmienna nie ma dokładności ułamków sekund, a jej sekundy zostały ustawione na zero. Ponadto minuty zostały zaokrąglone w górę, ponieważ pierwotna wartość miała wartość 30 sekund.
Kolejną obserwacją jest obcięcie przesunięcia strefy czasowej — smalldatetime typ danych nie ma świadomości strefy czasowej.
W tej konwersji rozmiar pamięci zmniejszył się z 10 bajtów (11 bajtów, gdy liczysz precyzję) dla przesunięcie daty i godziny , do 4 bajtów dla smalldatetime .
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, aby jawnie przekonwertować między przesunięciem daty i godziny i smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS smalldatetime) AS 'smalldatetime';
Wynik:
+------------------------------------+-------------------------+ | datetimeoffset | smalldatetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 | +------------------------------------+-------------------------+
Przykład 3 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład jawnej konwersji przy użyciu CONVERT()
funkcja zamiast CAST()
.
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(smalldatetime, @thedatetimeoffset) AS 'smalldatetime';
Wynik:
+------------------------------------+-------------------------+ | datetimeoffset | smalldatetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 | +------------------------------------+-------------------------+