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

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

Jeśli masz przesunięcie daty i godziny wartość, ale nie potrzebujesz części przesunięcia daty i strefy czasowej, konwertując ją na czas zaoszczędzi Ci dużo miejsca do przechowywania (usuwając niepotrzebne szczegóły z wartości). Ten artykuł zawiera przykłady konwersji przesunięcia daty i godziny wartość do czasu wartość w SQL Server.

przesunięcie daty i godziny typ danych zawiera datę i godzinę z przesunięciem strefy czasowej. Ma również część ułamków sekund od 0 do 7 (zależy to od liczby przypisanych do niej ułamków sekund). Odbywa się to za pomocą datetimeoffset(n) składnia. Jeśli tego nie określisz, użyje 7 (domyślnie). Rozmiar pamięci tego typu danych wynosi 8, 9 lub 10 bajtów, w zależności od używanej precyzji. Jego dokładność wynosi 100 nanosekund.

Czas z drugiej strony typ danych obejmuje tylko czas. Nie zawiera daty ani przesunięcia strefy czasowej. Jednak podobnie jak datetimeoffset pozwala również na określenie części ułamkowej sekundy pomiędzy 0 a 7 (za pomocą time(n) składnia). Używa 3, 4 lub 5 bajtów, w zależności od jego precyzji.

Kiedy konwertujesz przesunięcie daty i godziny wartość do czasu typ danych, tracisz część daty. Tracisz również przesunięcie strefy czasowej. Jednak zmniejszasz również rozmiar pamięci z 8 do 10 bajtów do 3, 4 lub 5 bajtów. Jednak wykonasz tę konwersję tylko wtedy, gdy nie potrzebujesz części daty lub przesunięcia strefy czasowej.

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 musisz dodać 1 bajt do podanych tutaj kwot.

Przykład 1 – Konwersja niejawna

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thetime time;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Wynik:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 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 czasu zmienna.

Tutaj widzimy, że czas wartość zawiera tylko czas (bez składnika daty). Składniki przesunięcia daty i strefy czasowej zostały usunięte z wartości.

W tym przykładzie oba typy danych używają domyślnej precyzji (co daje 7 miejsc po przecinku). Powoduje to przesunięcie daty i godziny wartość przy użyciu 10 bajtów i czasu wartość przy użyciu 5 bajtów.

Przykład 2 – Precyzja

Dokładny wynik będzie zależał od ustawień dokładności dla każdego typu danych. W następnym przykładzie czas wartość używa mniejszej precyzji w stosunku do oryginalnego przesunięcia daty i godziny wartość:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Wynik:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 |
+------------------------------------+------------------+

Mój system wyświetla końcowe zera, ale chodzi o to, że czas value ma teraz precyzję do zaledwie 3 miejsc po przecinku w porównaniu z 7 miejscami po przecinku, których używa oryginalna wartość.

Zmniejszenie precyzji może również spowodować czas wartość jest zaokrąglana w górę. Oto przykład:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Wynik:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 |
+------------------------------------+------------------+

W tym przypadku otrzymujemy ułamkową część 124 zamiast 123 , ponieważ następna cyfra była równa 5 lub większa.

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 czas .

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

Wynik:

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

Wynik:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 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. Utwórz tabelę (strukturę) z istniejącej tabeli

  2. ZAMÓW WEDŁUG DATY wyświetlając najpierw NULL, a następnie najnowsze daty

  3. Jak dodać AM/PM do wartości czasu w SQL Server (T-SQL)

  4. Zwróć wartość przyrostu kolumny tożsamości w SQL Server

  5. Automatyczne tworzenie zadania SQL Server