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

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

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

Jedna z zalet konwersji daty/godziny wartość do czasu polega na zmniejszeniu rozmiaru pamięci z 8 bajtów do 3, 4 lub 5 bajtów (w zależności od precyzji używanej przez czas wartość). Ściśle mówiąc, czas używa 4, 5 lub 6 bajtów, ponieważ dodatkowy bajt jest używany do przechowywania jego precyzji.

Po przekonwertowaniu daty/godziny 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órą przypiszesz do czasu . Kiedy czas dokładność jest mniejsza niż data-godzina precyzja, ułamki sekund są zaokrąglane w górę, aby pasowały do ​​czasu precyzja.

data i godzina typ danych ma maksymalnie 3 cyfry dla części ułamka sekund. Jego dokładność jest zaokrąglana z dokładnością do 0,000, 0,003 lub 0,007 sekundy.

Czas typ danych, z drugiej strony, pozwala określić precyzję ułamków sekund od 0 do 7. Jest to osiągane za pomocą time(n ) składnia, gdzie n to skala od 0 do 7. Jeśli tego nie określisz, użyje 7, co zapewnia dokładność 100 nanosekund.

Przykład 1 – Konwersja niejawna

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

DECLARE 
  @thedatetime datetime, 
  @thetime time;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Wynik:

+-------------------------+------------------+
| datetime                | time             |
|-------------------------+------------------|
| 2025-05-21 10:15:30.123 | 10:15:30.1233333 |
+-------------------------+------------------+

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ć datetime 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.

Widzimy również, że czas zmienna ma większą precyzję ułamków sekund i otrzymujemy część ułamkową 1233333 (w porównaniu z 123 na data i godzina wartość). Dzieje się tak, ponieważ czas wartość używa domyślnej skali 7 (ponieważ nie określiliśmy wyraźnie skali).

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

Oto przykład:

DECLARE 
  @thedatetime datetime, 
  @thetime time;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'thetime';

Wynik:

+-------------------------+------------------+
| datetime                | thetime          |
|-------------------------+------------------|
| 2025-05-21 10:15:30.127 | 10:15:30.1266667 |
+-------------------------+------------------+

W tym przykładzie ustawiłem ułamki sekund na 125 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).

Czas wartość jednak ustaw ułamki sekund na 1266667 .

Gdybyśmy po prostu ustawili wartość początkową na czas po pierwsze, jego część ułamkowa zwróciłaby 1250000 .

Przykład 3 – Precyzja/dokładność

Jak wspomniano, czas typ danych umożliwia określenie dokładności ułamków sekund. Jeśli tego nie zrobisz, używa 7 (dlatego poprzedni przykład używa 7).

Możesz to zmienić, używając czasu(n ) składnia. Dlatego mogłem użyć czasu(7) dla poprzednich przykładów, aby uzyskać ten sam wynik.

W tym przykładzie całkowicie usuwam ułamki sekund, używając time(0) :

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Wynik:

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.127 | 10:15:30 |
+-------------------------+----------+

Kiedy to zrobimy, rozmiar pamięci czas wartość jest zmniejszona do 3 bajtów (4 bajty, w tym precyzja), w przeciwieństwie do 8 bajtów dla datetime wartość.

Należy pamiętać, że użycie mniejszej precyzji niż oryginalna wartość spowoduje zaokrąglenie wyniku w górę, aby pasował do określonej precyzji.

Przykład:

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.525';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Wynik:

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.527 | 10:15:31 |
+-------------------------+----------+

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, aby jawnie przekonwertować między data godzina i czas .

DECLARE @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CAST(@thedatetime AS time(0)) AS 'time(0)';

Wynik:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 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 @thedatetime datetime;
SET @thedatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  CONVERT(time(0), @thedatetime) AS 'time(0)';

Wynik:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 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. Konwertuj „czas” na „datetime2” w SQL Server (przykłady T-SQL)

  2. Najlepszy magazyn danych dla miliardów wierszy

  3. ROLLBACK OBCIĄŻONY w SQL Server

  4. Jak zmienić schemat db na dbo

  5. SQL Server:Awaria łącza komunikacyjnego Wymagany SSL (nie udało się odebrać pakietu)