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 | +-----------------------------+-------------------------+