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

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

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

Po przekonwertowaniu data/godzina2 wartość przesunięcie daty i godziny , wynikowa wartość będzie zależeć od dokładności ułamków sekund, która jest przypisana do każdego typu danych, a także od dowolnego określonego przesunięcia strefy czasowej.

Oba typy danych umożliwiają określenie dokładności ułamków sekund od 0 do 7. Jeśli tego nie określisz, używana jest domyślna skala 7.

przesunięcie daty i godziny typ danych zawiera przesunięcie strefy czasowej i może zachować wszelkie przesunięcia w oryginalnej wartości. Jednak datetime2 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.

TODATETIMEOFFSET() funkcja została specjalnie zaprojektowana do konwersji wartości daty/czasu na przesunięcie daty/czasu i dodaj przesunięcie strefy czasowej. Jednak zobacz moje komentarze (i przykłady) poniżej dotyczące tej opcji.

Przykład 1 – Konwersja niejawna

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

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

Wynik:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Jest to niejawna konwersja, ponieważ nie używamy funkcji konwersji (takich jak te poniżej) do jawnej konwersji. W tym przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać datetime2 wartość na przesunięcie daty i godziny zmienna.

Widzimy, że przesunięcie daty i godziny zmienna może używać tej samej precyzji co datetime2 wartość (7 miejsc po przecinku). 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żyć 11 bajtów do przechowywania (10 na dane i 1 bajt na precyzję). data/godzina2 type używa 9 bajtów (8 dla danych i 1 bajt dla precyzji) przy użyciu skali 7.

Możesz jednak zmniejszyć precyzję, zastępując 7 niższą liczbą.

Przykład 2 – Zaokrąglanie

Jeśli przesunięcie daty i godziny ma mniejszą precyzję niż datetime2 wartość, zostanie zaokrąglona w górę.

Oto przykład:

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

Wynik:

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

W tym przykładzie datetime2 wartość ma skalę 7, ale przesunięcie daty i godziny skala wartości wynosi tylko 6. Dlatego jej precyzja wynosi tylko do 6 miejsc po przecinku, a szósta cyfra jest zaokrąglana do 7 (zamiast 6).

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 o jawnej konwersji między datetime2 i przesunięcie daty i godziny .

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

Wynik:

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

Wynik:

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

Przykład 5 – Zmiana przesunięcia strefy czasowej

Jeśli konwertujesz z datetime2 na przesunięcie daty i godziny , prawdopodobnie robisz to dla przesunięcia strefy czasowej. Jest również bardzo prawdopodobne, że będziesz potrzebować wartości innej niż domyślna +00:00.

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

Możesz także użyć tej funkcji, aby przekonwertować oryginalną datetime2 wartość na przesunięcie daty i godziny wartość. Ta funkcja akceptuje dowolną wartość daty/godziny, która może zostać przekształcona w datetime2 wartość i wartość przesunięcia.

Oto przykład:

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

Wynik:

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

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

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

Wynik:

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

Dlatego jeśli Twój datetime2 używa mniejszej precyzji niż przesunięcie daty i godziny , zawsze możesz ponownie przypisać ją do zmiennej z większą precyzją, a następnie przekazać tę przekonwertowaną wartość do TODATETIMEOFFSET() .

Przykład:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

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

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +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. Wydajność serwera SQL TOP IO Query -2

  2. Wygeneruj losową wartość int od 3 do 6

  3. Jak ZMIENIAĆ wiele kolumn jednocześnie w SQL Server

  4. Jak naprawić „Procedura oczekuje parametru „@statement” typu „ntext/nchar/nvarchar”. Błąd w SQL Server

  5. Dodaj zmienny kolor wiersza do raportu usług raportowania SQL Server