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

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

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

Po przekonwertowaniu smalldatetime wartość do czasu , tracisz datę. Kopiowane są godziny, minuty i sekundy. Ułamki sekund są ustawione na 0.

smalldatetime typ danych zawiera zarówno datę, jak i godzinę. Jednak czas nie ma żadnych ułamków sekund, a jego składnik sekund jest zawsze ustawiony na zero (:00). Jego dokładność jest do najbliższej minuty. Jego rozmiar pamięci to 4 bajty.

Czas z drugiej strony typ danych obejmuje tylko czas. Pozwala jednak na określenie dokładności ułamków sekund od 0 do 7. Jest to osiągane przez użycie time(n ) składnia, gdzie n to skala od 0 do 7. Jeśli tego nie określisz, użyje 7 (domyślnie), co zapewnia dokładność 100 nanosekund. Jeśli podasz zero (0 ), jego dokładność będzie z dokładnością do sekundy. Jego rozmiar pamięci będzie wynosił 3, 4 lub 5 bajtów (plus 1 bajt do przechowywania precyzji), w zależności od precyzji ułamka sekundy.

Przykład 1 – Konwersja niejawna

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Wynik:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:16:00 |
+---------------------+----------+

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

Czego nie? oczywiste (przynajmniej w moim przykładzie) jest to, że wartość czasu może w rzeczywistości obsłużyć część ułamkową sekund. Mój system nie wyświetla tutaj ułamków sekund, ale następny przykład pokaże, że w rzeczywistości precyzja ułamka sekundy wynosi 7.

Ponadto, jeśli przyjrzysz się uważnie, zobaczysz, że smalldatetime wartość zaokrąglona w górę minut od rzeczywistej wartości, którą próbowałem jej przypisać. Odzwierciedla to stosunkowo niską precyzję smalldatetime typ danych. Jego precyzja jest z dokładnością do minuty. Oczywistą konsekwencją tego jest to, że kiedy w końcu przypiszemy jej wartość do czasu typ danych, jest to przypisana wartość zaokrąglona w górę, a nie wartość początkowa, którą próbowałem przypisać. Gdybyśmy przypisali wartość początkową bezpośrednio do czasu zmienna, otrzymalibyśmy dokładniejszą wartość (nawet gdybyśmy określili skalę 0).

Oto, co mam na myśli:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Wynik:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:15:30 |
+---------------------+----------+

Przykład 2 – Dodawanie ułamków sekund

smalldatetime typ danych nie ma części ułamkowej sekund, ale w naszym pierwszym przykładzie czas value ma dokładność 7 ułamków sekund (mimo że w rzeczywistości nie wyświetla żadnych miejsc dziesiętnych). Znam jego precyzję, ponieważ nie określiłem skali podczas jej deklarowania, dlatego używa domyślnej skali 7.

Oto przykład potwierdzający, że czas wartość może w rzeczywistości obsługiwać część ułamkową:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'Original time',
  DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';

Wynik:

+---------------------+-----------------+------------------+
| smalldatetime       | Original time   | Modified time    |
|---------------------+-----------------+------------------|
| 2025-05-21 10:16:00 | 10:16:00        | 10:16:00.1234567 |
+---------------------+-----------------+------------------+

Zwróć uwagę, że kiedy czas value ma skalę 7, ma rozmiar pamięci 5 bajtów. Dlatego ma wyższe wymagania dotyczące przechowywania niż smalldatetime typ (który wykorzystuje tylko 4 bajty).

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

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

Wynik:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

W tym przykładzie ustawiłem skalę na 0.

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

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

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(time(0), @thesmalldatetime) AS 'time(0)';

Wynik:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16: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. Jak działa funkcja STR() w SQL Server (T-SQL)

  2. Jak połączyć wiele wierszy o tym samym identyfikatorze w sql?

  3. Jak zadokować / oddokować zapytania dotyczące okien i innych kart w SQL Server Management Studio (SSMS) — samouczek SQL Server / TSQL, część 21

  4. Zwróć podstawowy typ danych z wartości wariantu SQL_w SQL Server

  5. Pobierz lewą część ciągu w SQL Server (T-SQL)