Tento článek obsahuje příklady převodu datetime hodnotu na datetime2 hodnotu v SQL Server.
Když převedete datum a čas hodnotu na datetime2 , bude výsledná hodnota záviset na přesnosti ve zlomcích sekund, kterou přiřadíte datetime2 .
datum a čas datový typ má maximálně 3 číslice ve zlomcích sekund. Jeho přesnost je zaokrouhlena na 0,000, 003 nebo 007 sekund.
datetime2 datový typ vám na druhé straně umožňuje zadat přesnost ve zlomcích sekund od 0 do 7. Pokud toto nezadáte, použije se 7 (výchozí).
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datetime a datetime2 .
DECLARE @thedatetime datetime, @thedatetime2 datetime2; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thedatetime2 = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetime2 AS 'datetime2';
Výsledek:
+-------------------------+-----------------------------+ | datetime | datetime2 | |-------------------------+-----------------------------| | 2025-05-21 10:15:30.123 | 2025-05-21 10:15:30.1233333 | +-------------------------+-----------------------------+
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 datetime hodnotu na datetime2 proměnná.
Vidíme, že datetime2 proměnná má větší přesnost na zlomkové sekundy a my skončíme u zlomkové části 1233333 (vs 123 pro datum a čas hodnota).
Příklad 2 – Zaokrouhlení
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. Jak můžete očekávat, může to způsobit spoustu zmatků, pokud si nejste vědomi toho, jak to funguje. Nejen, že to může způsobit zmatek při použití datetime sám o sobě může způsobit další zmatek při převodu této hodnoty na jiný datový typ.
Zde je příklad, který ukazuje, co tím myslím.
DECLARE @thedatetime datetime, @thedatetime2 datetime2; SET @thedatetime = '2025-05-21 10:15:30.125'; SET @thedatetime2 = @thedatetime; SELECT @thedatetime AS 'datetime', @thedatetime2 AS 'datetime2';
Výsledek:
+-------------------------+-----------------------------+ | datetime | datetime2 | |-------------------------+-----------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 | +-------------------------+-----------------------------+
V tomto příkladu jsem nastavil zlomkové sekundy na 125
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).
datetime2 hodnotu však nastavte zlomkové sekundy na 1266667 .
Mimochodem, pokud bychom jednoduše nastavili počáteční hodnotu na datetime2 za prvé, jeho zlomková část by vrátila 1250000 .
Příklad 3 – Přesnost/přesnost
Jedna z výhod datetime2 spočívá v tom, že vám umožňuje určit přesnost ve zlomcích sekund. Pokud to neuděláte, použije 7 (proto předchozí příklad používá 7).
Můžeme tedy upravit předchozí příklad tak, že datetime2 hodnota používá stejnou přesnost ve zlomcích sekund jako datetime datový typ.
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';
Výsledek:
+-------------------------+-------------------------+ | datetime | datetime2 | |-------------------------+-------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Když to uděláme, datetime2 value vrací stejný výsledek jako datetime hodnota. Také využívá stejné množství úložiště (8 bajtů). V tomto případě datetime2 používá 7 bajtů k uložení hodnoty a 1 bajt k uložení přesnosti hodnoty.
Můžete dokonce zadat méně přesnost ve zlomcích sekund než datum a čas pokud nepotřebujete extra přesnost. Tímto způsobem ušetříte celý bajt úložného prostoru (vaše datetime2 hodnota použije 7 bajtů ve srovnání s 8 bajty pro datetime hodnota).
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';
Výsledek:
+-------------------------+------------------------+ | datetime | datetime2 | |-------------------------+------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.13 | +-------------------------+------------------------+
Mějte na paměti, že to může také způsobit zaokrouhlení zlomků sekund.
Příklad 4 – Explicitní převod 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 datetime a datetime2 .
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CAST(@thedatetime AS datetime2(3)) AS 'datetime2(3)';
Výsledek:
+-------------------------+-------------------------+ | datetime | datetime2(3) | |-------------------------+-------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Příklad 5 – Explicitní převod pomocí CONVERT()
Zde je příklad explicitní konverze pomocí CONVERT()
funkce namísto CAST()
.
DECLARE @thedatetime datetime; SET @thedatetime = '2025-05-21 10:15:30.125'; SELECT @thedatetime AS 'datetime', CONVERT(datetime2(3), thedatetime) AS 'datetime2(3)';
Výsledek:
+-------------------------+-------------------------+ | datetime | datetime2(3) | |-------------------------+-------------------------| | 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.127 | +-------------------------+-------------------------+
Doporučení společnosti Microsoft
Společnost Microsoft doporučuje používat explicitní přetypování vždy, když existuje smíšený scénář srovnání mezi těmito dvěma datovými typy:
Pod úrovní kompatibility databáze 130 implicitní převody z datetime do datetime2 datové typy vykazují vyšší přesnost tím, že zohledňují zlomkové milisekundy, což má za následek různé převedené hodnoty… Použijte explicitní přetypování na datetime2 datový typ vždy, když se jedná o smíšený scénář porovnání mezi datetime a datetime2 datové typy existují.