Ten artykuł zawiera przykłady konwersji czasu wartość do smalldatetime wartość w SQL Server.
Po przekonwertowaniu czasu wartość smalldatetime , data jest ustawiona na „1900-01-01”, a wartości godzin i minut są zaokrąglane w górę. Sekundy i ułamki sekund są ustawione na 0.
Przykład 1 – 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 z czasu do smalldatetime .
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Wynik:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Dodawana jest więc część daty i ustawiana na „1900-01-01”, w tym przypadku wartości minut są zaokrąglane w górę, a sekundy ustawiane na 0.
Dokumentacja Microsoft stwierdza, że ułamki sekund są również ustawione na zero, ale smalldatetime typ danych i tak nie obejmuje ułamków sekund.
Przy okazji, gdy używasz smalldatetime typ danych, drugi składnik jest zawsze ustawiony na 0.
Przykład 2 – Zaokrąglanie godziny
Oto przykład zaokrąglania godziny:
DECLARE @thetime time(0); SET @thetime = '10:59:59'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Wynik:
+----------+---------------------+ | time | smalldatetime | |----------+---------------------| | 10:59:59 | 1900-01-01 11:00:00 | +----------+---------------------+
W tym przypadku również określiłem skalę 0 dla wartości czasu, jednak nie ma to wpływu na wynik.
Żeby było jasne, skaluj to liczba cyfr po prawej stronie przecinka dziesiętnego w liczbie. Precyzja to całkowita liczba cyfr w liczbie. Kiedy określamy skalę 0, oznacza to, że część ułamkowa nie jest uwzględniona.
Przykład 3 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład użycia CONVERT()
funkcja zamiast CAST()
.
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(smalldatetime, @thetime) AS 'smalldatetime';
Wynik:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Przykład 4 – Konwersja niejawna
Oto przykład zrobienia tego samego, ale przy użyciu niejawnej konwersji typu.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Wynik:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Tak więc otrzymujemy ten sam wynik, niezależnie od tego, czy jest to konwersja jawna czy niejawna.
Jest to niejawna konwersja, ponieważ nie używamy funkcji konwersji do jawnej konwersji. Po prostu przypisujemy wartość ze zmiennej jednego typu danych do zmiennej o innym typie danych. W tym przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać czas wartość do smalldatetime zmienna.
Przykład 5 – Zmień datę
Jeśli chcesz zmienić datę (ale zachować tę samą godzinę), możesz użyć DATEADD()
funkcjonować.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Wynik:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1985-01-01 23:16:00 | +------------------+---------------------+
W tym przypadku dodaję 85 do wartości roku, co daje rok 1985.
Pamiętaj jednak, że smalldatetime obsługuje bardzo wąski zakres dat (1900-01-01 do 2079-06-06), więc dodanie zbyt dużej ilości do roku może spowodować błąd przepełnienia, taki jak ten poniżej:
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Wynik:
Adding a value to a 'smalldatetime' column caused an overflow.