Ten artykuł zawiera przykłady konwersji daty/godziny wartość do czasu wartość w SQL Server.
Jedna z zalet konwersji daty/godziny wartość do czasu polega na zmniejszeniu rozmiaru pamięci z 8 bajtów do 3, 4 lub 5 bajtów (w zależności od precyzji używanej przez czas wartość). Ściśle mówiąc, czas używa 4, 5 lub 6 bajtów, ponieważ dodatkowy bajt jest używany do przechowywania jego precyzji.
Po przekonwertowaniu daty/godziny wartość do czasu , kopiowana jest tylko część czasu wartości. Dokładny wynik będzie zależał od dokładności ułamków sekund, którą przypiszesz do czasu . Kiedy czas dokładność jest mniejsza niż data-godzina precyzja, ułamki sekund są zaokrąglane w górę, aby pasowały do czasu precyzja.
data i godzina typ danych ma maksymalnie 3 cyfry dla części ułamka sekund. Jego dokładność jest zaokrąglana z dokładnością do 0,000, 0,003 lub 0,007 sekundy.
Czas typ danych, z drugiej strony, pozwala określić precyzję ułamków sekund od 0 do 7. Jest to osiągane za pomocą time(n ) składnia, gdzie n to skala od 0 do 7. Jeśli tego nie określisz, użyje 7, co zapewnia dokładność 100 nanosekund.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między data godzina i czas .
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Wynik:
+-------------------------+------------------+ | datetime | time | |-------------------------+------------------| | 2025-05-21 10:15:30.123 | 10:15:30.1233333 | +-------------------------+------------------+
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ć datetime 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.
Widzimy również, że czas zmienna ma większą precyzję ułamków sekund i otrzymujemy część ułamkową 1233333 (w porównaniu z 123 na data i godzina wartość). Dzieje się tak, ponieważ czas wartość używa domyślnej skali 7 (ponieważ nie określiliśmy wyraźnie skali).
Przykład 2 – Zaokrąglanie
data i godzina typ danych jest zaokrąglany do przyrostów o 0,000, 0,003 lub 0,007 sekundy. Nawet jeśli jawnie ustawisz ją na inną wartość, zostanie ona zaokrąglona.
Oto przykład:
DECLARE @thedatetime datetime, @thetime time; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'thetime';
Wynik:
+-------------------------+------------------+ | datetime | thetime | |-------------------------+------------------| | 2025-05-21 10:15:30.127 | 10:15:30.1266667 | +-------------------------+------------------+
W tym przykładzie ustawiłem ułamki sekund na 125
ale data i godzina zaokrąglono w górę do
127
(ponieważ można go zaokrąglać tylko do przyrostów o 0,000, 0,003 lub 0,007 sekundy).
Czas wartość jednak ustaw ułamki sekund na 1266667 .
Gdybyśmy po prostu ustawili wartość początkową na czas po pierwsze, jego część ułamkowa zwróciłaby 1250000 .
Przykład 3 – Precyzja/dokładność
Jak wspomniano, czas typ danych umożliwia określenie dokładności ułamków sekund. Jeśli tego nie zrobisz, używa 7 (dlatego poprzedni przykład używa 7).
Możesz to zmienić, używając czasu(n ) składnia. Dlatego mogłem użyć czasu(7) dla poprzednich przykładów, aby uzyskać ten sam wynik.
W tym przykładzie całkowicie usuwam ułamki sekund, używając time(0) :
DECLARE @thedatetime datetime, @thetime time(0); SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Wynik:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+----------+
Kiedy to zrobimy, rozmiar pamięci czas wartość jest zmniejszona do 3 bajtów (4 bajty, w tym precyzja), w przeciwieństwie do 8 bajtów dla datetime wartość.
Należy pamiętać, że użycie mniejszej precyzji niż oryginalna wartość spowoduje zaokrąglenie wyniku w górę, aby pasował do określonej precyzji.
Przykład:
DECLARE @thedatetime datetime, @thetime time(0); SET @thedatetime = '2025-05-21 10:15:30.525'; SET @thetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thetime AS 'time';
Wynik:
+-------------------------+----------+ | datetime | time | |-------------------------+----------| | 2025-05-21 10:15:30.527 | 10:15:31 | +-------------------------+----------+
Przykład 4 – 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 data godzina i czas .
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS time(0)) AS 'time(0)';
Wynik:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+
Przykład 5 – Jawna konwersja przy użyciu funkcji CONVERT()
Oto przykład jawnej konwersji przy użyciu CONVERT()
funkcja zamiast CAST()
.
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(time(0), @thedatetime) AS 'time(0)';
Wynik:
+-------------------------+-----------+ | datetime | time(0) | |-------------------------+-----------| | 2025-05-21 10:15:30.127 | 10:15:30 | +-------------------------+-----------+