Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Konwertuj „datetime” na „datetimeoffset” w SQL Server (przykłady T-SQL)

Ten artykuł zawiera przykłady konwersji daty/godziny wartość na przesunięcie daty i godziny wartość w SQL Server.

Po przekonwertowaniu daty/godziny wartość przesunięcie daty i godziny , wynikowa wartość będzie zależeć od dokładności ułamków sekund, którą przypiszesz do datetimeoffset , a także określone przesunięcie strefy czasowej.

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.

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 data i godzina nie ma świadomości strefy czasowej, więc nie ma żadnych wartości do zachowania. W takim przypadku przesunięcie strefy czasowej jest domyślnie 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. Istnieje jednak subtelny szczegół, o którym należy pamiętać podczas korzystania z tej funkcji, i wyjaśnię to poniżej (z przykładami).

Przykład 1 – Konwersja niejawna

Po pierwsze, oto przykład niejawnej konwersji między datetime i przesunięcie daty i godziny .

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);SET @thedatetime ='2025-05-21 10:15:30.123';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset(7)';

Wynik:

+--------------------------+--------------------- ----------------+| datagodzina | dataprzesunięcie czasowe(7) ||------------------------------+------------------ ------------------|| 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 +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ć datetime wartość na przesunięcie daty i godziny zmienna.

Widzimy, że przesunięcie daty i godziny zmienna ma większą precyzję ułamków sekund i otrzymujemy ułamkową część 1233333 (w porównaniu z 123 na data i godzina wartość). Kończymy również z przesunięciem strefy czasowej o +00:00 .

Użycie dokładności 7 ułamków sekund powoduje przesunięcie daty i godziny używać 10 bajtów do przechowywania (11 bajtów, jeśli uwzględnisz bajt przechowujący jego precyzję). Dla porównania, data i godzina używa tylko 8 bajtów. Możesz jednak zmniejszyć dokładność przesunięcia daty i godziny wartość, zastępując 7 mniejszą liczbą. To ta sama koncepcja, co przy użyciu datetime2 typ danych. Zobacz Konwersja „datetime” na „datetime2” w SQL Server, aby zapoznać się z przykładami tego, jak może to wpłynąć na wynik końcowy.

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. Może to spowodować wiele zamieszania, jeśli nie wiesz, jak to działa. Może to nie tylko powodować zamieszanie podczas korzystania z datetime samo w sobie może powodować dodatkowe zamieszanie podczas konwersji tej wartości na inny typ danych.

Oto przykład, który pokazuje, o co mi chodzi.

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset;SET @thedatetime ='2025-05-21 10:15:30.125';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset( 7)';

Wynik:

+--------------------------+--------------------- ----------------+| datagodzina | dataprzesunięcie czasowe(7) ||------------------------------+------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |+-----------------------------+-------- ----------------------------+

W tym przykładzie ustawiłem ułamki sekund na 125 ale data i godzina zaokrąglono w górę do 127 (ponieważ ten typ danych można zaokrąglać tylko do przyrostów o 0,000, 0,003 lub 0,007 sekundy).

przesunięcie daty i godziny z drugiej strony ustaw ułamki sekund na 1266667 .

Gdybyśmy jednak po prostu ustawili wartość początkową na datetimeoffset po pierwsze, jego część ułamkowa zwróciłaby 1250000 .

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 data godzina i przesunięcie daty i godziny .

DECLARE @thedatetime datetime;SET @thedatetime ='2025-05-21 10:15:30.125';SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS datetimeoffset(7)) AS 'datetimeoffset(7)';

Wynik:

+--------------------------+--------------------- ----------------+| datagodzina | dataprzesunięcie czasowe(7) ||------------------------------+------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |+-----------------------------+-------- ----------------------------+

Przykład 4 – 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(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';

Wynik:

+--------------------------+--------------------- ----------------+| datagodzina | dataprzesunięcie czasowe(7) ||------------------------------+------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |+-----------------------------+-------- ----------------------------+

Przykład 5 – Zmiana przesunięcia strefy czasowej

Jeśli masz kłopoty z konwersją daty/godziny wartości do przesunięcie daty i godziny , prawdopodobnie potrzebujesz przesunięcia strefy czasowej. I istnieje duże prawdopodobieństwo, że chcesz ustawić coś innego niż +00:00.

Na szczęście możesz użyć TODATETIMEOFFSET() funkcja zmiany przesunięcia.

Możesz również użyć tej funkcji, aby przekonwertować oryginalną datę i godzinę 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 @thedatetime datetime, @thedatetimeoffset datetimeoffset;SET @thedatetime ='2025-05-21 10:15:30.125';SET @thedatetimeoffset =TODATETIMEOFFSET(@datetime, '+07:00');SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS 'datetimeoffset';

Wynik:

+--------------------------+--------------------- ----------------+| datagodzina | dataprzesunięcie czasowe(7) ||------------------------------+------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |+-----------------------------+-------- ----------------------------+

A oto przykład użycia funkcji w SELECT oświadczenie:

DECLARE @thedatetime datetime ='2025-05-21 10:15:30.125';SELECT @thedatetime AS 'datetime', TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';

Wynik:

+--------------------------+--------------------- ----------------+| datagodzina | dataprzesunięcie czasowe(7) ||------------------------------+------------------ ------------------|| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +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 data i godzina argument, więc ma skalę 3 (tj. 3 ułamki sekund). To może, ale nie musi być dla Ciebie problemem. Jeśli tak, zawsze możesz przekonwertować go na przesunięcie daty i godziny najpierw przekaż tę przekonwertowaną wartość do TODATETIMEOFFSET() .

Przykład:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);SET @thedatetime ='2025-05-21 10:15:30.125';SET @thedatetimeoffset =@thedatetime;SELECT @thedatetime AS 'datetime', @thedatetimeoffset AS „datetimeoffset”, TODATETIMEOFFSET(@thedatetimeoffset, „+07:00”) JAKO „Zmodyfikowany”;

Wynik (przy użyciu wyjścia pionowego):

datagodzina | 2025-05-21 10:15:30.127dataprzesunięcie czasu | 2025-05-21 10:15:30.1266667 +00:00Zmodyfikowano | 2025-05-21 10:15:30.1266667 +07:00
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. krzyżowe zapytanie xml działa wykładniczo gorzej wraz ze wzrostem dokumentu xml

  2. 7 sposobów na znalezienie zduplikowanych wierszy w SQL Server, ignorując dowolny klucz podstawowy

  3. Jak naprawić „Lista wyboru dla instrukcji INSERT zawiera mniej elementów niż lista wstawiania”

  4. Jak dodać właściwość tożsamości do istniejącej kolumny w SQL Server?

  5. SQL Server — krótkie obwody zapytań?