Ten artykuł zawiera przykłady konwersji smalldatetime wartość do czasu wartość w SQL Server.
Po przekonwertowaniu smalldatetime wartość do czasu , tracisz datę. Kopiowane są godziny, minuty i sekundy. Ułamki sekund są ustawione na 0.
smalldatetime typ danych zawiera zarówno datę, jak i godzinę. Jednak czas 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. Jego rozmiar pamięci to 4 bajty.
Czas z drugiej strony typ danych obejmuje tylko czas. Pozwala jednak na określenie dokładności ułamków sekund od 0 do 7. Jest to osiągane przez użycie time(n ) składnia, gdzie n to skala od 0 do 7. Jeśli tego nie określisz, użyje 7 (domyślnie), co zapewnia dokładność 100 nanosekund. Jeśli podasz zero (0
), jego dokładność będzie z dokładnością do sekundy. Jego rozmiar pamięci będzie wynosił 3, 4 lub 5 bajtów (plus 1 bajt do przechowywania precyzji), w zależności od precyzji ułamka sekundy.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między data godzina i czas .
DECLARE @thesmalldatetime smalldatetime, @thetime time; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'time';
Wynik:
+---------------------+----------+ | smalldatetime | time | |---------------------+----------| | 2025-05-21 10:16:00 | 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ć smalldatetime wartość do czasu zmienna.
Najbardziej oczywistą rzeczą w tym wyniku jest to, że czas wartość nie zawiera daty. Należy się tego spodziewać, ponieważ czas typ danych służy wyłącznie do przechowywania wartości czasu, a nie wartości dat.
Czego nie? oczywiste (przynajmniej w moim przykładzie) jest to, że wartość czasu może w rzeczywistości obsłużyć część ułamkową sekund. Mój system nie wyświetla tutaj ułamków sekund, ale następny przykład pokaże, że w rzeczywistości precyzja ułamka sekundy wynosi 7.
Ponadto, jeśli przyjrzysz się uważnie, zobaczysz, że smalldatetime wartość zaokrąglona w górę minut od rzeczywistej wartości, którą próbowałem jej przypisać. Odzwierciedla to stosunkowo niską precyzję smalldatetime typ danych. Jego precyzja jest z dokładnością do minuty. Oczywistą konsekwencją tego jest to, że kiedy w końcu przypiszemy jej wartość do czasu typ danych, jest to przypisana wartość zaokrąglona w górę, a nie wartość początkowa, którą próbowałem przypisać. Gdybyśmy przypisali wartość początkową bezpośrednio do czasu zmienna, otrzymalibyśmy dokładniejszą wartość (nawet gdybyśmy określili skalę 0).
Oto, co mam na myśli:
DECLARE @thesmalldatetime smalldatetime, @thetime time(0); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'time';
Wynik:
+---------------------+----------+ | smalldatetime | time | |---------------------+----------| | 2025-05-21 10:16:00 | 10:15:30 | +---------------------+----------+
Przykład 2 – Dodawanie ułamków sekund
smalldatetime typ danych nie ma części ułamkowej sekund, ale w naszym pierwszym przykładzie czas value ma dokładność 7 ułamków sekund (mimo że w rzeczywistości nie wyświetla żadnych miejsc dziesiętnych). Znam jego precyzję, ponieważ nie określiłem skali podczas jej deklarowania, dlatego używa domyślnej skali 7.
Oto przykład potwierdzający, że czas wartość może w rzeczywistości obsługiwać część ułamkową:
DECLARE @thesmalldatetime smalldatetime, @thetime time; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thetime = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thetime AS 'Original time', DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';
Wynik:
+---------------------+-----------------+------------------+ | smalldatetime | Original time | Modified time | |---------------------+-----------------+------------------| | 2025-05-21 10:16:00 | 10:16:00 | 10:16:00.1234567 | +---------------------+-----------------+------------------+
Zwróć uwagę, że kiedy czas value ma skalę 7, ma rozmiar pamięci 5 bajtów. Dlatego ma wyższe wymagania dotyczące przechowywania niż smalldatetime typ (który wykorzystuje tylko 4 bajty).
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 smalldatetime i czas .
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CAST(@thesmalldatetime AS time(0)) AS 'time(0)';
Wynik:
+---------------------+-----------+ | smalldatetime | time(0) | |---------------------+-----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+-----------+
W tym przykładzie ustawiłem skalę na 0.
Przykład 4 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład jawnej konwersji przy użyciu CONVERT()
funkcja zamiast CAST()
.
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CONVERT(time(0), @thesmalldatetime) AS 'time(0)';
Wynik:
+---------------------+-----------+ | smalldatetime | time(0) | |---------------------+-----------| | 2025-05-21 10:16:00 | 10:16:00 | +---------------------+-----------+