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

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

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

Po przekonwertowaniu czasu wartość smalldatetime , data jest ustawiona na „1900-01-01”, a wartości godzin i minut są zaokrąglane w górę. Sekundy i ułamki sekund są ustawione na 0.

Przykład 1 – 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 z czasu do smalldatetime .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Wynik:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Dodawana jest więc część daty i ustawiana na „1900-01-01”, w tym przypadku wartości minut są zaokrąglane w górę, a sekundy ustawiane na 0.

Dokumentacja Microsoft stwierdza, że ​​ułamki sekund są również ustawione na zero, ale smalldatetime typ danych i tak nie obejmuje ułamków sekund.

Przy okazji, gdy używasz smalldatetime typ danych, drugi składnik jest zawsze ustawiony na 0.

Przykład 2 – Zaokrąglanie godziny

Oto przykład zaokrąglania godziny:

DECLARE @thetime time(0);
SET @thetime = '10:59:59';
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS smalldatetime) AS 'smalldatetime';

Wynik:

+----------+---------------------+
| time     | smalldatetime       |
|----------+---------------------|
| 10:59:59 | 1900-01-01 11:00:00 |
+----------+---------------------+

W tym przypadku również określiłem skalę 0 dla wartości czasu, jednak nie ma to wpływu na wynik.

Żeby było jasne, skaluj to liczba cyfr po prawej stronie przecinka dziesiętnego w liczbie. Precyzja to całkowita liczba cyfr w liczbie. Kiedy określamy skalę 0, oznacza to, że część ułamkowa nie jest uwzględniona.

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

Oto przykład użycia CONVERT() funkcja zamiast CAST() .

DECLARE @thetime time;
SET @thetime = '23:15:59.1234567';
SELECT 
  @thetime AS 'time',
  CONVERT(smalldatetime, @thetime) AS 'smalldatetime';

Wynik:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Przykład 4 – Konwersja niejawna

Oto przykład zrobienia tego samego, ale przy użyciu niejawnej konwersji typu.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Wynik:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1900-01-01 23:16:00 |
+------------------+---------------------+

Tak więc otrzymujemy ten sam wynik, niezależnie od tego, czy jest to konwersja jawna czy niejawna.

Jest to niejawna konwersja, ponieważ nie używamy funkcji konwersji do jawnej konwersji. Po prostu przypisujemy wartość ze zmiennej jednego typu danych do zmiennej o innym typie danych. W tym przypadku SQL Server wykonuje niejawną konwersję za kulisami, gdy próbujemy przypisać czas wartość do smalldatetime zmienna.

Przykład 5 – Zmień datę

Jeśli chcesz zmienić datę (ale zachować tę samą godzinę), możesz użyć DATEADD() funkcjonować.

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Wynik:

+------------------+---------------------+
| time             | smalldatetime       |
|------------------+---------------------|
| 23:15:59.1234567 | 1985-01-01 23:16:00 |
+------------------+---------------------+

W tym przypadku dodaję 85 do wartości roku, co daje rok 1985.

Pamiętaj jednak, że smalldatetime obsługuje bardzo wąski zakres dat (1900-01-01 do 2079-06-06), więc dodanie zbyt dużej ilości do roku może spowodować błąd przepełnienia, taki jak ten poniżej:

DECLARE @thetime time, @thesmalldatetime smalldatetime;
SET @thetime = '23:15:59.1234567';
SET @thesmalldatetime = @thetime;
SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime);
SELECT 
  @thetime AS 'time',
  @thesmalldatetime AS 'smalldatetime';

Wynik:

Adding a value to a 'smalldatetime' column caused an overflow.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rozwiązywanie problemów z długimi zapytaniami w MS SQL Server

  2. Podzapytanie używające Exists 1 lub Exists *

  3. Jak przechowywać katalog / hierarchię / strukturę drzewa w bazie danych?

  4. TransactSQL do uruchomienia innego skryptu TransactSQL

  5. Jak zainstalować SQL Server w systemie Linux