Jeśli masz przesunięcie daty i godziny wartość, ale nie potrzebujesz części przesunięcia czasu i strefy czasowej, konwertując ją na datę 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ść na datę 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 (plus 1 bajt do przechowywania precyzji), w zależności od używanej precyzji. Jego dokładność wynosi 100 nanosekund.
data z drugiej strony typ danych zawiera tylko datę. Nie zawiera czasu i ma dokładność 1 dnia. Do przechowywania używa 3 bajtów.
Kiedy konwertujesz przesunięcie daty i godziny wartość na datę typ danych, tracisz część czasu (w tym przesunięcie strefy czasowej). Jednak zmniejszasz również rozmiar pamięci do stałych 3 bajtów. Oczywiście wykonałbyś tę konwersję tylko wtedy, gdy nie potrzebujesz części czasu i przesunięcia strefy czasowej.
Przykład 1 – Konwersja niejawna
Oto przykład niejawnej konwersji między przesunięciem daty i godziny i data .
DECLARE @thedatetimeoffset datetimeoffset, @thedate date; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thedate = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedate AS 'date';
Wynik:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+
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ść na datę zmienna.
Tutaj widzimy, że data wartość zawiera tylko datę (bez składnika czasu). Składnik czasu, w tym przesunięcie strefy czasowej, został usunięty z wartości.
W tym przykładzie przesunięcie daty i godziny value używa domyślnej precyzji (co daje 7 miejsc po przecinku). Powoduje to, że typ danych wykorzystuje 10 bajtów (w rzeczywistości 11 bajtów, jeśli policzysz dodatkowy bajt przechowujący precyzję). data value wykorzystuje tylko 3 bajty.
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 data .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS date) AS 'date';
Wynik:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+
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 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(date, @thedatetimeoffset) AS 'date';
Wynik:
+------------------------------------+------------+ | datetimeoffset | date | |------------------------------------+------------| | 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 | +------------------------------------+------------+