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

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

Ten artykuł zawiera przykłady konwersji data/godzina2 wartość do czasu wartość w SQL Server.

Jedna z korzyści konwersji data/godzina2 wartość do czasu polega na zmniejszeniu rozmiaru pamięci z 6 do 8 bajtów, do 3 do 5 bajtów (w zależności od precyzji przypisanej do niej przez każdy typ danych). Ściśle mówiąc, 1 dodatkowy bajt jest używany do przechowywania precyzji dla tych typów danych, więc powinieneś dodać 1 bajt do tych ilości.

Oczywiście tracisz część daty podczas konwersji, ale nie wykonałbyś tej konwersji, gdybyś musiał zachować część daty.

Po przekonwertowaniu data/godzina2 wartość do czasu , kopiowana jest tylko część czasu wartości. Dokładny wynik będzie zależał od dokładności ułamków sekund, która jest przypisana do każdego typu. Kiedy czas dokładność jest mniejsza niż datetime2 precyzja, ułamki sekund są zaokrąglane w górę, aby pasowały do ​​czasu precyzja.

Jeśli chodzi o precyzję, oba typy danych pozwalają określić skalę od 0 miejsc po przecinku do 7. Dzięki temu masz możliwość wykonania konwersji bez utraty ułamków sekund lub zaokrąglania wyniku w górę.

Przykład 1 – Konwersja niejawna

Oto przykład niejawnej konwersji między datetime2 i czas .

DECLARE 
  @thedatetime2 datetime2, 
  @thetime time;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thetime AS 'time';

Wynik:

+-----------------------------+------------------+
| datetime2                   | time             |
|-----------------------------+------------------|
| 2025-05-21 10:15:30.1234567 | 10:15:30.1234567 |
+-----------------------------+------------------+

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ść do czasu zmienna.

Najbardziej oczywistą rzeczą w tym wyniku jest to, że czas wartość nie zawiera daty. Należy się tego spodziewać, ponieważ czas typ danych służy wyłącznie do przechowywania wartości czasu, a nie wartości dat.

Ponadto w tym przykładzie oba typy danych używają domyślnej precyzji (w skali 7). Oznacza to, że czas wartość kończy się z taką samą precyzją jak datetime2 wartość. Powodem, dla którego wiem, że używają domyślnej precyzji, jest to, że podczas ich deklarowania nie określiłem ułamka sekundy.

Przykład 2 – Konwersja na wyższą precyzję

W tym przykładzie czas zmienna używa wyższej precyzji do datetime2 zmienny.

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

Wynik:

+--------------------------+------------------+
| datetime2                | time             |
|--------------------------+------------------|
| 2025-05-21 10:15:30.1235 | 10:15:30.1235000 |
+--------------------------+------------------+

W tym przypadku datetime2 zmienna wykorzystuje skalę 4, a czas zmienna używa 7.

Powoduje to datetime2 zaokrąglając w górę ułamki sekund, więc otrzymujemy 1235 zamiast 1234 . Oznacza to również, że kiedy przekonwertujemy go na czas , wartość kończy się trzema końcowymi zerami (ponieważ określiliśmy skalę 7). Oznacza to również, że czas rozmiar pamięci wartości wynosi 5 bajtów (6 z precyzją) w porównaniu do 4 bajtów (5 z precyzją), gdybyśmy dali mu skalę 4.

Przykład 3 – Konwersja na niższą precyzję

W tym przykładzie czas zmienna używa mniejszej precyzji niż datetime2 zmienny.

DECLARE 
  @thedatetime2 datetime2(7), 
  @thetime time(0);
SET @thedatetime2 = '2025-05-21 10:15:30.5678912';
SET @thetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thetime AS 'time';

Wynik:

+-----------------------------+----------+
| datetime2                   | time     |
|-----------------------------+----------|
| 2025-05-21 10:15:30.5678912 | 10:15:31 |
+-----------------------------+----------+

Więc w tym przypadku czas Skala jest zmniejszona do 0, co oznacza, że ​​wynik nie obejmuje ułamków sekund. Również sekundy są odpowiednio zaokrąglane.

Czas wartość wykorzystuje 4 bajty pamięci (w tym precyzję), w porównaniu do 9 bajtów dla datetime2 wartość (i w porównaniu do 6 bajtów dla czasu wartość w poprzednim przykładzie).

Przykład 4 – 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 czas .

DECLARE @thedatetime2 datetime2(3);
SET @thedatetime2 = '2025-05-21 10:15:30.123';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS time(0)) AS 'time(0)';

Wynik:

+-------------------------+-----------+
| datetime2               | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.123 | 10:15:30  |
+-------------------------+-----------+

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

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

DECLARE @thedatetime2 datetime2(3);
SET @thedatetime2 = '2025-05-21 10:15:30.123';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(time(0), @thedatetime2) AS 'time(0)';

Wynik:

+-------------------------+-----------+
| datetime2               | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.123 | 10:15:30  |
+-------------------------+-----------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Twórz zagnieżdżone tablice JSON za pomocą FOR JSON PATH

  2. Wyświetl listę wszystkich baz danych z serwera połączonego w programie SQL Server (przykłady T-SQL)

  3. Jak Operator w Entity Framework?

  4. SQL zaznacz wszystko, jeśli parametr ma wartość null, w przeciwnym razie zwróć określoną pozycję

  5. Wewnętrzne elementy SQL Server:operatorzy problematyczni Pt. I – Skany