sql >> Databáze >  >> RDS >> Sqlserver

Převést „datetime2“ na „datetime“ v SQL Server (příklady T-SQL)

Pravděpodobně existuje jen velmi málo případů použití, které by způsobily převod datetime2 hodnotu na datetime v SQL Server. Zejména datetime2 datový typ lze nastavit tak, aby používal stejnou velikost úložiště jako datetime , ale s vyšší přesností. Takže ve většině případů by vám bylo lépe s datetime2 než s datem a časem . Společnost Microsoft také doporučuje používat datetime2 místo datetime .

Pokud se však ocitnete v situaci, kdy potřebujete provést tuto konverzi, tento článek obsahuje některé příklady a úvahy, které mohou být užitečné.

Když převedete datetime2 hodnotu na datetime , bude výsledná hodnota záviset na zlomcích sekund, které byly přiřazeny k datetime2 hodnotu a také její přesnost.

datetime2 datový typ umožňuje zadat přesnost ve zlomcích sekund od 0 do 7. Pokud toto nezadáte, použije se 7 (výchozí).

datum a čas datový typ má na druhou stranu maximálně 3 číslice pro část zlomků sekund. Jeho přesnost je zaokrouhlena na 0,000, 003 nebo 007 sekund.

Pokud tedy datetime2 používá stupnici 3, bude výsledná hodnota velmi blízká (ne-li totožná) původní hodnotě. Nicméně kvůli nižší přesnosti datetime , výsledky se mohou lišit kvůli zaokrouhlování, které provádí.

Příklad 1 – Implicitní konverze

Zde je příklad implicitní konverze mezi datetime2 a datum a čas .

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

Výsledek:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

Jedná se o implicitní převod, protože k jeho explicitnímu převodu nepoužíváme konverzní funkci (jako jsou ty níže). V tomto případě SQL Server provede implicitní převod za scénou, když se pokusíme přiřadit datetime2 hodnotu na datum a čas proměnná.

Vidíme, že datum a čas proměnná má menší přesnost ve zlomcích sekund a my skončíme u zlomkové části 123 i když původní zlomková část byla 1234567 .

V tomto případě nebylo provedeno žádné zaokrouhlení.

Příklad 2 – Přesnost/přesnost a zaokrouhlování

datum a čas datový typ se zaokrouhlí na přírůstky 0,000, 003 nebo 0,007 sekund. I když ji výslovně nastavíte na jinou hodnotu, bude zaokrouhlena.

To platí také při převodu z jiného datového typu (jako je to, co děláme zde).

Zde je příklad, který ukazuje, co tím myslím.

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

Výsledek:

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

V tomto příkladu jsem nastavil zlomkové sekundy datetime2 hodnotu na 1256789 ale datum a čas zaokrouhleno nahoru na 127 (protože jej lze zaokrouhlit pouze na přírůstky 0,000, 003 nebo 0,007 sekund).

Je důležité si uvědomit, že to bude stále platit, i když datetime2 přiřadíme pouze 3 zlomkové sekundy hodnota.

Příklad:

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

Výsledek:

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

Vyplatí se také dávat pozor na jakékoli zaokrouhlování, které může nastat na původní datetime2 hodnota. datetime2 samotná hodnota by mohla být zaokrouhlena nahoru, pokud se pokusíme přiřadit hodnotu s větším počtem zlomkových sekund, než je její vlastní měřítko.

Příklad:

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

Výsledek:

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

V tomto případě se snažím přiřadit hodnotu se zlomkovou částí 1256789 . Protože však datetime2(3) hodnota má pouze stupnici 3, může podporovat pouze 3 desetinná místa a v tomto případě je poslední číslice zaokrouhlena nahoru (protože následující číslice je 5 nebo vyšší).

Oba datetime2(3) a datum a čas použít stejné množství úložného prostoru (8 bajtů). datetime2(3) datový typ ve skutečnosti používá 7 bajtů k uložení dat, ale navíc 1 bajt k uložení přesnosti.

Příklad 3 – Explicitní konverze pomocí CAST()

Zde je příklad explicitní konverze. V tomto případě používám CAST() funkce přímo v SELECT k explicitnímu převodu mezi datetime2 a datum a čas .

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

Výsledek:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

Příklad 4 – Explicitní převod pomocí CONVERT()

Zde je příklad explicitní konverze pomocí CONVERT() funkce namísto CAST() .

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

Výsledek:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

  1. PHP + SQL Server - Jak nastavit znakovou sadu pro připojení?

  2. MySQL:Jak povolit vzdálené připojení k mysql

  3. Hekaton se zvratem:TVP v paměti – část 1

  4. Jak vložit C# List do databáze pomocí Dapper.NET