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

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

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

Po przekonwertowaniu daty/godziny wartość datetime2 , wynikowa wartość będzie zależeć od dokładności ułamków sekund, którą przypiszesz do datetime2 .

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.

data/godzina2 z drugiej strony typ danych umożliwia określenie dokładności ułamka sekundy od 0 do 7. Jeśli tego nie określisz, użyje 7 (wartość domyślna).

Przykład 1 – Konwersja niejawna

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

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

Wynik:

+-------------------------+-----------------------------+
| datetime                | datetime2                   |
|-------------------------+-----------------------------|
| 2025-05-21 10:15:30.123 | 2025-05-21 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 datetime2 zmienna.

Widzimy, że datetime2 zmienna ma większą precyzję ułamków sekund i otrzymujemy ułamkową część 1233333 (w porównaniu z 123 na data i godzina wartość).

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. Jak można się spodziewać, może to spowodować wiele zamieszania, jeśli nie wiesz, jak to działa. Może to nie tylko powodować zamieszanie podczas korzystania z datetime samo w sobie może powodować dodatkowe zamieszanie podczas konwersji tej wartości na inny typ danych.

Oto przykład, który pokazuje, o co mi chodzi.

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

Wynik:

+-------------------------+-----------------------------+
| datetime                | datetime2                   |
|-------------------------+-----------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 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).

data/godzina2 wartość jednak ustaw ułamki sekund na 1266667 .

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

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

Jedna z zalet datetime2 jest to, że pozwala określić precyzję ułamków sekund. Jeśli tego nie zrobisz, używa 7 (dlatego poprzedni przykład używa 7).

Możemy zatem zmodyfikować poprzedni przykład tak, aby datetime2 wartość używa tej samej dokładności ułamków sekund co data-godzina typ danych.

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2(3);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Wynik:

+-------------------------+-------------------------+
| datetime                | datetime2               |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Kiedy to robimy, datetime2 wartość zwraca ten sam wynik, co data-godzina wartość. Wykorzystuje również tę samą ilość pamięci (8 bajtów). W tym przypadku datetime2 wykorzystuje 7 bajtów do przechowywania wartości i 1 bajt do przechowywania precyzji wartości.

Możesz nawet określić mniej dokładność ułamków sekund niż data-godzina jeśli nie potrzebujesz dodatkowej precyzji. Dzięki temu zaoszczędzisz cały bajt miejsca w pamięci (Twoja datetime2 wartość użyje 7 bajtów, w porównaniu do 8 bajtów dla datetime wartość).

DECLARE 
  @thedatetime datetime, 
  @thedatetime2 datetime2(2);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetime2 = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetime2 AS 'datetime2';

Wynik:

+-------------------------+------------------------+
| datetime                | datetime2              |
|-------------------------+------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.13 |
+-------------------------+------------------------+

Pamiętaj, że może to również spowodować zaokrąglenie ułamków sekund.

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

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

Wynik:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

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(datetime2(3), thedatetime) AS 'datetime2(3)';

Wynik:

+-------------------------+-------------------------+
| datetime                | datetime2(3)            |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Rekomendacja firmy Microsoft

Firma Microsoft zaleca używanie rzutowania jawnego, gdy istnieje mieszany scenariusz porównania między tymi dwoma typami danych:

Na poziomie zgodności bazy danych 130 niejawne konwersje z data-godzina do datetime2 typy danych wykazują zwiększoną dokładność, biorąc pod uwagę ułamki milisekund, co skutkuje różnymi przekonwertowanymi wartościami… Użyj jawnego rzutowania do datetime2 typ danych, gdy mieszany scenariusz porównania między data-godzina i data/godzina2 typy danych istnieją.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. EF5:Nie można dołączyć pliku „{0}” jako bazy danych „{1}”

  2. Czy zadanie SQL Server pominie zaplanowane uruchomienie, jeśli jest już uruchomione?

  3. Konfiguracja środowiska startowego w SQL Server Management Studio (SSMS) — samouczek SQL Server / TSQL część 7

  4. Różnica między podzapytaniem a skorelowanym podzapytaniem

  5. Jak znaleźć sumę wielu kolumn w tabeli w SQL Server 2005?