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

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

Ten artykuł zawiera przykłady konwersji przesunięcia daty i godziny wartość datetime2 w SQL Server.

Kiedy konwertujesz przesunięcie daty i godziny wartość datetime2 , data i godzina są kopiowane do datetime2 wartość, a strefa czasowa zostanie obcięta. Ułamki sekund są również obcinane, aby zmieściły się, jeśli dokładność miejsca docelowego jest niższa.

przesunięcie daty i godziny typ danych umożliwia określenie dokładności ułamków sekund od 0 do 7 przy użyciu datetimeoffset(n) składnia. Jeśli tego nie określisz, użyje 7 (domyślnie). Ma również przesunięcie strefy czasowej. Rozmiar pamięci tego typu danych wynosi 8, 9 lub 10 bajtów, w zależności od używanej precyzji.

data/godzina2 typ danych pozwala również na określenie dokładności ułamków sekund od 0 do 7 (za pomocą datetime2(n) składnia). Nie ma świadomości strefy czasowej. Jego rozmiar pamięci wynosi 6, 7 lub 8, w zależności od używanej precyzji.

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 dodaj 1 bajt do podanych tutaj ilości, aby uzyskać pełniejszy obraz wymagań dotyczących przechowywania.

Przykład 1 – Konwersja niejawna

Oto przykład niejawnej konwersji między przesunięciem daty i godziny i data/godzina2 .

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedatetime2 datetime2;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Wynik:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 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 datetime2 zmienna.

W tym przykładzie oba typy danych używają domyślnej dokładności (7 miejsc po przecinku). Dlatego część ułamkowa to 1234567 dla obu wyników.

Widzimy również, że przesunięcie strefy czasowej zostało obcięte — datetime2 typ danych nie ma świadomości strefy czasowej.

W tej konwersji rozmiar pamięci zmniejszył się z 10 bajtów (dla datetimeoffset ) do 8 bajtów (dla datetime2 ), chociaż należy pamiętać, że 1 bajt jest dodawany w celu przechowywania precyzji.

Przykład 2 – Inna precyzja

Oto przykład, który pokazuje, co się stanie, jeśli datetime2 wartość używa mniejszej precyzji do przesunięcia daty i godziny wartość.

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Wynik:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime2               |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |
+------------------------------------+-------------------------+

W tym przykładzie przesunięcie daty i godziny ma skalę 7 ale datetime2 wartość ma skalę tylko 3 . Dlatego ułamki sekund zostały obcięte, aby zmieścić.

Pamiętaj, że może to spowodować zaokrąglenie. Oto przykład, w którym ułamkowa część datetime2 wartość jest zaokrąglana w górę do 124 .

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +07:00';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

Wynik:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime2               |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 |
+------------------------------------+-------------------------+

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 data/godzina2 .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +07:00';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS datetime2) AS 'datetime2';

Wynik:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 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 +07:00';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(datetime2, @thedatetimeoffset) AS 'datetime2';

Wynik:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |
+------------------------------------+-----------------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ustaw sortowanie bazy danych w inicjatorze Code-First Entity Framework

  2. Zmiana sortowania SQL Server na bez uwzględniania wielkości liter z rozróżniania wielkości liter?

  3. Zwróć nazwę lokalnego serwera w SQL Server z @@NAZWASERWERA

  4. Poprawka:„Nie można wykonać DZIENNIKA KOPII ZAPASOWEJ, ponieważ nie ma bieżącej kopii zapasowej bazy danych”. w SQL Server/SQL Edge

  5. Jak bezpiecznie przechowywać hasła w bazie danych?