Pokud máte datetimeoffset hodnotu, ale nepotřebujete část posunutí času a časového pásma, převedete ji na datum 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 datu 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ů (plus 1 bajt pro uložení přesnosti), v závislosti na použité přesnosti. Jeho přesnost je 100 nanosekund.
Datum datový typ na druhé straně obsahuje pouze datum. Nezahrnuje čas a má přesnost 1 den. K ukládání používá 3 bajty.
Když převedete datetimeoffset hodnotu k datu datový typ, ztratíte časovou část (včetně posunu časového pásma). Zmenšíte však také velikost úložiště na pevné 3 bajty. Tento převod byste samozřejmě provedli pouze v případě, že nepotřebujete časovou část a posun časového pásma.
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datetimeoffset a datum .
DECLARE @thedatetimeoffset datetimeoffset, @thedate date;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +10:30';SET @thedate =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimedateoffset', @thedatetimeoffset', @thedatetimeoffset AS 'date';
Výsledek:
+------------------------------------+--------- ---+| datum a čas offset | datum ||------------------------------------+----------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+------------------------------------+------- ------+
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 datu proměnná.
Zde vidíme, že datum hodnota obsahuje pouze datum (bez časové složky). Z hodnoty byla odstraněna časová složka včetně posunutí časového pásma.
V tomto příkladu datetimeoffset hodnota používá výchozí přesnost (což má za následek 7 desetinných míst). Výsledkem je, že datový typ používá 10 bajtů (ve skutečnosti 11 bajtů, pokud počítáte bajt navíc, který ukládá přesnost). Datum hodnota používá pouze 3 bajty.
Příklad 2 – 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 datum .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +10:30';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS date) AS 'datum';
Výsledek:
+------------------------------------+--------- ---+| datum a čas offset | datum ||------------------------------------+----------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+------------------------------------+------- ------+
Příklad 3 – 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(date, @thedatetimeoffset) AS 'date';Výsledek:
+------------------------------------+--------- ---+| datum a čas offset | datum ||------------------------------------+----------- --|| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |+------------------------------------+------- ------+