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

Przykłady konwersji „czasu” na „datagodzina” w SQL Server (T-SQL)

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

Po przekonwertowaniu czasu wartość do data i godzina , dodatkowe informacje są dodawane do wartości. Dzieje się tak, ponieważ data i godzina typ danych zawiera zarówno informacje o dacie, jak i godzinie. Czas z drugiej strony typ danych zawiera tylko informacje o czasie. Dlatego informacja o dacie jest dodawana do wartości podczas takiej konwersji. W szczególności data jest ustawiona na „1900-01-01”.

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 data/godzina .

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

Wynik:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Gdy konwertujesz od czasu do data/godzina , składnik daty jest ustawiony na 1900-01-01 .

Zauważ również, że sama wartość czasu jest prezentowana inaczej w obu tych typach danych. Czas typ danych dodaje zero na końcu (ponieważ ma większą precyzję – domyślna skala to 7). Z drugiej strony data i godzina wartości używają niższej skali i są zaokrąglane z dokładnością do 0,000, 0,003 lub 0,007 sekundy. Jeśli uważasz, że jest to problematyczne, rozważ konwersję na datetime2 zamiast.

Przykład 2 – Niższa precyzja/skala

W poprzednim przykładzie czas wartość miała wyższą precyzję ułamków sekund niż data-godzina wartość. Dzieje się tak, ponieważ używa domyślnej skali 7. Ale w razie potrzeby możemy zmienić ją na niższą.

Żeby było jasne, skaluj to liczba cyfr po prawej stronie przecinka dziesiętnego w liczbie. Precyzja to całkowita liczba cyfr w liczbie. Skalę możemy określić, dodając liczbę w nawiasach do typu danych.

Oto, co się stanie, jeśli wyraźnie ustawię czas wartość, aby mieć niższą skala niż data i godzina wartość.

DECLARE @thetime time(0)
SET @thetime = '23:15:59.004007'
SELECT 
  @thetime AS 'time',
  CAST(@thetime AS datetime) AS 'datetime';

Wynik:

+----------+-------------------------+
| time     | datetime                |
|----------+-------------------------|
| 23:15:59 | 1900-01-01 23:15:59.000 |
+----------+-------------------------+

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

To jest to samo, co w pierwszym przykładzie, z tą różnicą, że tym razem używam metody CONVERT() funkcja zamiast CAST() .

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

Wynik:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Przykład 4 – Konwersja niejawna

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

DECLARE @thetime time, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Wynik:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |
+------------------+-------------------------+

Dzięki temu 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ść na data i godzina 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, @thedatetime datetime
SET @thetime = '23:15:59.004007'
SET @thedatetime = @thetime
SET @thedatetime = DATEADD(year, 120, @thedatetime)
SELECT 
  @thetime AS 'time',
  @thedatetime AS 'datetime';

Wynik:

+------------------+-------------------------+
| time             | datetime                |
|------------------+-------------------------|
| 23:15:59.0040070 | 2020-01-01 23:15:59.003 |
+------------------+-------------------------+

W tym przypadku dodaję 120 do wartości roku, co daje rok 2020.


  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 wykonać GROUP BY na aliasowanej kolumnie w MS-SQL Server?

  2. Wstawianie danych SQL Server do Salesforce za pomocą kursora

  3. Usuwanie zapamiętanej listy loginów i haseł w SQL Server Management Studio

  4. Jak włączyć przechwytywanie zmian danych (CDC) w całej tabeli LUB włączyć funkcję CDC w tabeli z listą kolumn w programie SQL Server

  5. Jak utworzyć listę rozdzielaną przecinkami za pomocą zapytania SQL?