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

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

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

Kiedy konwertujesz przesunięcie daty i godziny wartość do data i godzina , wartości daty i godziny są kopiowane, a przesunięcie strefy czasowej jest obcinane. Gdy ułamkowa precyzja przesunięcia daty i godziny wartość jest większa niż trzy cyfry, wartość jest obcinana.

przesunięcie daty i godziny typ danych pozwala określić precyzję ułamków sekund od 0 do 7. Jest to realizowane za pomocą 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. Kolejny bajt jest używany do przechowywania precyzji, więc dodaje to 1 bajt do tych liczb.

data i godzina z drugiej strony typ danych ma maksymalnie 3 cyfry dla części ułamkowej sekundy. Jego dokładność jest zaokrąglana z dokładnością do 0,000, 0,003 lub 0,007 sekundy. Ten typ danych nie ma świadomości strefy czasowej, a zatem nie ma przesunięcia strefy czasowej. Jego rozmiar pamięci to 8 bajtów.

Przykład 1 – Konwersja niejawna

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

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

Wynik:

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

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 data i godzina zmienna.

Widzimy, że data i godzina zmienna ma mniejszą dokładność ułamków sekund i otrzymujemy ułamkową część 123 mimo że oryginalna część ułamkowa to 1234567 .

W tym przypadku nie wykonano zaokrąglania.

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

W tej konwersji rozmiar pamięci zmniejszył się z 10 bajtów (11 bajtów, jeśli uwzględnisz dodatkowy bajt przechowujący precyzję) dla przesunięcie daty i godziny , do 8 bajtów dla data i godzina . Jeśli jednak przesunięcie daty i godziny value użyłaby skali od 0 do 2, użyłaby tylko 8 bajtów (9 łącznie z precyzją).

Gdyby użył skali 3 (odpowiednik datetime wartość), rozmiar pamięci wynosiłby 9 bajtów (10 z dokładnością). Jednak jego dokładność byłaby wyższa niż data-godzina . Oczywiście dokładność zostanie zmniejszona, gdy tylko przekonwertujemy ją na data i godzina .

Przykład 2 – Precyzja/Dokładność i 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.

Dotyczy to również konwersji z innego typu danych (takiego jak to, co tutaj robimy).

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedatetime datetime;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1250000 +07:00';
SET @thedatetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime AS 'datetime';

Wynik:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime                |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |
+------------------------------------+-------------------------+

W tym przykładzie ustawiłem ułamki sekund przesunięcie daty i godziny wartość do 1250000 ale data i godzina zaokrąglono w górę do 127 (ponieważ można go zaokrąglać tylko do przyrostów o 0,000, 0,003 lub 0,007 sekundy).

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 i godzina .

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

Wynik:

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

Przykład 4 – Jawna konwersja przy użyciu funkcji CONVERT()

Oto przykład jawnej konwersji przy użyciu metody CONVERT() funkcja zamiast CAST() .

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

Wynik:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. YEAR() Przykłady w SQL Server (T-SQL)

  2. Jak wyczyścić (zapobiec wstrzyknięciu SQL) dynamiczny SQL w SQL Server?

  3. Jak wyświetlić sortowanie serwerów w programie SQL Server (T-SQL)

  4. Jak korzystać z kreatora importu/eksportu w programie SQL Server — samouczek dotyczący SQL Server/TSQL, część 104

  5. 3 sposoby konwersji HEX na INT w SQL Server (T-SQL)