Pokud máte datetimeoffset hodnotu, ale nepotřebujete část posunutí data a časového pásma, převedete ji na čas vám ušetří spoustu místa v úložišti (a zároveň odstraní zbytečné detaily z hodnoty). Tento článek obsahuje příklady převodu datetimeoffset hodnotu k času hodnotu v SQL Server.
datetimeoffset datový typ zahrnuje datum a čas s posunem časového pásma. Má také zlomkovou sekundovou část mezi 0 a 7 (to závisí na tom, kolik zlomkových sekund je jí přiřazeno). To se provádí pomocí datetimeoffset(n)
syntax. Pokud toto nezadáte, použije se 7 (výchozí). Velikost úložiště tohoto typu dat je buď 8, 9 nebo 10 bajtů, v závislosti na použité přesnosti. Jeho přesnost je 100 nanosekund.
Čas datový typ na druhé straně zahrnuje pouze čas. Nezahrnuje datum a nezahrnuje posun časového pásma. Nicméně podobně jako datetimeoffset také vám umožňuje zadat část ve zlomcích sekund mezi 0 a 7 (pomocí time(n)
syntax). Používá buď 3, 4 nebo 5 bajtů, v závislosti na jeho přesnosti.
Když převedete datetimeoffset hodnotu k času datový typ, ztratíte část data. Ztratíte také posun časového pásma. Můžete však také snížit velikost úložiště z 8 až 10 bajtů na 3, 4 nebo 5 bajtů. Tento převod byste však provedli pouze v případě, že nepotřebujete část data nebo posun časového pásma.
Všimněte si, že částky úložiště uvedené zde jsou částky uvedené v dokumentaci společnosti Microsoft. Tyto datové typy však také používají 1 bajt k uložení přesnosti. Proto budete muset k částkám uvedeným zde přidat 1 bajt.
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datetimeoffset a čas .
DECLARE @thedatetimeoffset datetimeoffset, @thetime time; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Výsledek:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+
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 datetimeoffset hodnotu k času proměnná.
Zde vidíme, že čas hodnota zahrnuje pouze čas (bez složky data). Komponenty posunu data a časového pásma byly z hodnoty odstraněny.
V tomto příkladu oba datové typy používají výchozí přesnost (což má za následek 7 desetinných míst). Výsledkem je datetimeoffset hodnotu pomocí 10 bajtů a času hodnotu pomocí 5 bajtů.
Příklad 2 – Přesnost
Přesný výsledek bude záviset na nastavení přesnosti pro každý typ dat. V dalším příkladu čas hodnota používá nižší přesnost než původní datetimeoffset hodnota:
DECLARE @thedatetimeoffset datetimeoffset(7), @thetime time(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Výsledek:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 | +------------------------------------+------------------+
Můj systém zobrazuje koncové nuly, ale jde o to, že čas value má nyní přesnost na pouhá 3 desetinná místa ve srovnání se 7 desetinnými místy, které používá původní hodnota.
Snížení přesnosti může mít také za následek čas hodnota se zaokrouhluje nahoru. Zde je příklad:
DECLARE @thedatetimeoffset datetimeoffset(7), @thetime time(3); SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30'; SET @thetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thetime AS 'time';
Výsledek:
+------------------------------------+------------------+ | datetimeoffset | time | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 | +------------------------------------+------------------+
V tomto případě skončíme se zlomkovou částí 124 místo 123 , protože následující číslice byla 5 nebo větší.
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 datetimeoffset a čas .
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS time) AS 'time';
Výsledek:
+------------------------------------+------------------+ | datetimeoffset | date | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+
Příklad 4 – Explicitní převod pomocí CONVERT()
Zde je příklad explicitní konverze pomocí CONVERT()
funkce namísto CAST()
.
DECLARE @thedatetimeoffset datetimeoffset; SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(time, @thedatetimeoffset) AS 'time';
Výsledek:
+------------------------------------+------------------+ | datetimeoffset | date | |------------------------------------+------------------| | 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 | +------------------------------------+------------------+