Ten artykuł zawiera przykłady konwersji smalldatetime wartość na przesunięcie daty i godziny wartość w SQL Server.
Po przekonwertowaniu smalldatetime wartość przesunięcie daty i godziny , smalldatetime wartość jest kopiowana do przesunięcia daty i godziny wartość. Ułamki sekund są ustawione na 0, a przesunięcie strefy czasowej na +00:00.
smalldatetime typ danych 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.
przesunięcie daty i godziny z drugiej strony typ danych umożliwia określenie dokładności ułamka sekundy od 0 do 7. Jeśli tego nie określisz, użyje 7 (wartość domyślna). Ma również przesunięcie strefy czasowej i może zachować wszelkie przesunięcia w oryginalnej wartości. Jednak smalldatetime nie ma świadomości strefy czasowej, więc nie ma żadnych wartości do zachowania. W takim przypadku przesunięcie strefy czasowej jest ustawione na +00:00.
SQL Server faktycznie ma funkcję TODATETIMEOFFSET()
funkcja, która jest specjalnie zaprojektowana do konwersji wartości daty/czasu na przesunięcie daty/czasu i dodaj przesunięcie strefy czasowej. Jednak poniżej znajdują się moje komentarze i kilka przykładów dotyczących tej opcji.
Przykład 1 – Konwersja niejawna
Po pierwsze, oto przykład niejawnej konwersji między smalldatetime i przesunięcie daty i godziny .
DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetimeoffset = @thesmalldatetime; SELECT @thesmalldatetime AS 'smalldatetime', @thedatetimeoffset AS 'datetimeoffset(7)';
Wynik:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset(7) | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00: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ść na przesunięcie daty i godziny zmienna.
Widzimy, że przesunięcie daty i godziny zmienna ma część ułamkową ( 0000000 ), natomiast smalldatetime wartość nie ma części ułamkowej, a jej minuty zostały zaokrąglone w górę podczas przypisywania jej wartości początkowej. przesunięcie daty i godziny wartość obejmuje również przesunięcie strefy czasowej o +00:00 .
Użycie dokładności 7 ułamków sekund powoduje przesunięcie daty i godziny użyć 11 bajtów do przechowywania (10 bajtów na przechowywanie danych, 1 bajt na precyzję). Dla porównania smalldatetime używa tylko 4 bajtów. Możesz jednak zmniejszyć dokładność przesunięcia daty i godziny wartość, zastępując 7 mniejszą liczbą. Jeśli chcesz całkowicie usunąć część ułamkową sekund, po prostu użyj datetimeoffset(0)
. Spowoduje to zmniejszenie rozmiaru pamięci do 9 bajtów (w tym 1 dla precyzji).
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 o jawnej konwersji między smalldatetime i przesunięcie daty i godziny .
DECLARE @thesmalldatetime smalldatetime; SET @thesmalldatetime = '2025-05-21 10:15:30.125'; SELECT @thesmalldatetime AS 'smalldatetime', CAST(@thesmalldatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';
Wynik:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset(7) | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 | +---------------------+------------------------------------+
Przykład 3 – 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(datetimeoffset(7), @thesmalldatetime) AS 'datetimeoffset(7)';
Wynik:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset(7) | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 | +---------------------+------------------------------------+
Przykład 4 – Zmiana przesunięcia strefy czasowej
Fakt, że konwertujesz swój smalldatetime wartości do przesunięcie daty i godziny oznacza, że prawdopodobnie robisz to dla przesunięcia strefy czasowej. I prawdopodobnie chcesz ustawić inne przesunięcie niż +00:00 (domyślne przesunięcie).
Na szczęście możesz użyć TODATETIMEOFFSET()
funkcja zmiany przesunięcia.
Możesz także użyć tej funkcji, aby przekonwertować oryginalny smalldatetime wartość na przesunięcie daty i godziny wartość. Ta funkcja akceptuje wartość daty/czasu (która może zostać przekształcona w datetime2 wartość) oraz wartość przesunięcia.
Oto przykład:
DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset; SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00'); SELECT @thesmalldatetime AS 'smalldatetime', @thedatetimeoffset AS 'datetimeoffset';
Wynik:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 | +---------------------+------------------------------------+
A oto przykład użycia funkcji w SELECT
oświadczenie:
DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30'; SELECT @thesmalldatetime AS 'smalldatetime', TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';
Wynik:
+---------------------+------------------------------------+ | smalldatetime | datetimeoffset | |---------------------+------------------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 | +---------------------+------------------------------------+
Jedna ważna kwestia dotycząca TODATETIMEOFFSET()
funkcja polega na tym, że używa tej samej dokładności ułamkowej, co przekazany do niej argument daty/godziny. W tym przypadku jest to smalldatetime argument, który nie ma ułamków sekund.
Mój system zwraca końcowe zera z przesunięciem daty i godziny część ułamkowa, jednak możesz zobaczyć coś takiego:
+---------------------+----------------------------+ | smalldatetime | datetimeoffset | |---------------------+----------------------------| | 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 | +---------------------+----------------------------+
Tak czy inaczej, nadal możesz w pełni wykorzystać przesunięcie daty i godziny precyzja typu danych, jeśli chcesz później zmienić wartość.
Oto przykład, w którym użyto DATEADD()
funkcja do zmiany ułamków sekund po zakończeniu konwersji.
DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7); SET @thesmalldatetime = '2025-05-21 10:15:30'; SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00'); SELECT @thesmalldatetime AS 'smalldatetime', @thedatetimeoffset AS 'datetimeoffset', DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';
Wynik (przy użyciu wyjścia pionowego):
smalldatetime | 2025-05-21 10:16:00 datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00 Modified | 2025-05-21 10:16:00.1234567 +07:00