Jeśli masz przesunięcie daty i godziny wartość, ale nie potrzebujesz części przesunięcia daty i strefy czasowej, konwertując ją na czas zaoszczędzi Ci dużo miejsca do przechowywania (usuwając niepotrzebne szczegóły z wartości). Ten artykuł zawiera przykłady konwersji przesunięcia daty i godziny wartość do czasu wartość w SQL Server.
przesunięcie daty i godziny typ danych zawiera datę i godzinę z przesunięciem strefy czasowej. Ma również część ułamków sekund od 0 do 7 (zależy to od liczby przypisanych do niej ułamków sekund). Odbywa się to za pomocą datetimeoffset(n)
składnia. Jeśli tego nie określisz, użyje 7 (domyślnie). Rozmiar pamięci tego typu danych wynosi 8, 9 lub 10 bajtów, w zależności od używanej precyzji. Jego dokładność wynosi 100 nanosekund.
Czas z drugiej strony typ danych obejmuje tylko czas. Nie zawiera daty ani przesunięcia strefy czasowej. Jednak podobnie jak datetimeoffset pozwala również na określenie części ułamkowej sekundy pomiędzy 0 a 7 (za pomocą time(n)
składnia). Używa 3, 4 lub 5 bajtów, w zależności od jego precyzji.
Kiedy konwertujesz przesunięcie daty i godziny wartość do czasu typ danych, tracisz część daty. Tracisz również przesunięcie strefy czasowej. Jednak zmniejszasz również rozmiar pamięci z 8 do 10 bajtów do 3, 4 lub 5 bajtów. Jednak wykonasz tę konwersję tylko wtedy, gdy nie potrzebujesz części daty lub przesunięcia strefy czasowej.
Zwróć uwagę, że wymienione tutaj ilości magazynu są kwotami wymienionymi w dokumentacji firmy Microsoft. Jednak te typy danych również używają 1 bajtu do przechowywania precyzji. Dlatego musisz dodać 1 bajt do podanych tutaj kwot.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między przesunięciem daty i godziny i czas .
DECLARE @thedatetimeoffset datetimeoffset, @thetime time; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Wynik:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+
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 czasu zmienna.
Tutaj widzimy, że czas wartość zawiera tylko czas (bez składnika daty). Składniki przesunięcia daty i strefy czasowej zostały usunięte z wartości.
W tym przykładzie oba typy danych używają domyślnej precyzji (co daje 7 miejsc po przecinku). Powoduje to przesunięcie daty i godziny wartość przy użyciu 10 bajtów i czasu wartość przy użyciu 5 bajtów.
Przykład 2 – Precyzja
Dokładny wynik będzie zależał od ustawień dokładności dla każdego typu danych. W następnym przykładzie czas wartość używa mniejszej precyzji w stosunku do oryginalnego przesunięcia daty i godziny wartość:
DECLARE @thedatetimeoffset datetimeoffset(7), @thetime time(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Wynik:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 | +------------------------------------+------------------+
Mój system wyświetla końcowe zera, ale chodzi o to, że czas value ma teraz precyzję do zaledwie 3 miejsc po przecinku w porównaniu z 7 miejscami po przecinku, których używa oryginalna wartość.
Zmniejszenie precyzji może również spowodować czas wartość jest zaokrąglana w górę. Oto przykład:
DECLARE @thedatetimeoffset datetimeoffset(7), @thetime time(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Wynik:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 | +------------------------------------+------------------+
W tym przypadku otrzymujemy ułamkową część 124 zamiast 123 , ponieważ następna cyfra była równa 5 lub większa.
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, aby jawnie przekonwertować między przesunięciem daty i godziny i czas .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS time) AS 'time';
Wynik:
+------------------------------------+------------------+ | datetimeoffset | date | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+
Przykład 4 – 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 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(time, @thedatetimeoffset) AS 'time';
Wynik:
+------------------------------------+------------------+ | datetimeoffset | date | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+