Tento článek obsahuje příklady převodu datetimeoffset hodnotu na datetime v SQL Serveru.
Když převedete datetimeoffset hodnotu na datetime , hodnoty data a času se zkopírují a posun časového pásma se zkrátí. Když je zlomková přesnost datetimeoffset je větší než tři číslice, hodnota je zkrácena.
datetimeoffset datový typ umožňuje zadat přesnost na zlomky sekund od 0 do 7. To se provádí pomocí datetimeoffset(n)
syntax. Pokud toto nezadáte, použije se 7 (výchozí). Má také posun časového pásma. Velikost úložiště tohoto typu dat je buď 8, 9 nebo 10 bajtů, v závislosti na použité přesnosti. Další bajt se používá k uložení přesnosti, takže se k těmto číslům přidá 1 bajt.
datum a čas datový typ má na druhou stranu maximálně 3 číslice pro svou část ve zlomcích sekund. Jeho přesnost je zaokrouhlena na přírůstky 0,000, 003 nebo 0,007 sekund. Tento typ dat nemá povědomí o časovém pásmu, a proto nemá žádný posun časového pásma. Velikost jeho úložiště je 8 bajtů.
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datetimeoffset a datum a čas .
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset AS, @thedatetimeoffset' AS 'datetime';
Výsledek:
+------------------------------------+--------- -----------------+| datum a čas offset | datum a čas ||------------------------------------+----------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 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 datetimeoffset 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í.
Také vidíme, že posun časového pásma byl zkrácen. datum a čas datový typ nemá povědomí o časovém pásmu.
V tomto převodu se velikost úložiště zmenšila z 10 bajtů (11 bajtů, pokud zahrnete bajt navíc, který ukládá přesnost) pro datetimeoffset , na 8 bajtů pro datum a čas . Pokud však datetimeoffset Pokud by hodnota používala stupnici mezi 0 a 2, použila by pouze 8 bajtů (9 včetně přesnosti).
Pokud by použil stupnici 3 (ekvivalent datetime hodnota), velikost úložiště by byla 9 bajtů (10 s přesností). Jeho přesnost by však byla vyšší než datetime . Jakmile ji převedeme na datum a čas, přesnost by se samozřejmě snížila .
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 @thedatetimeoffset datetimeoffset, @thedatetime datetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1250000 +07:00';SET @thedatetime =@thedatetimeoffset;SELECT @thedatetimeoffset AS, @thedatetimeoffset' AS 'datetime';
Výsledek:
+------------------------------------+--------- -----------------+| datum a čas offset | datum a čas ||------------------------------------+----------- ----------------|| 2025-05-21 10:15:30.1250000 +07:00 | 2025-05-21 10:15:30.127 |+------------------------------------+- ------------------------+
V tomto příkladu jsem nastavil zlomkové sekundy datetimeoffset hodnotu na 1250000
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).
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 datum a čas .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime);<'datetime' /před>Výsledek:
+------------------------------------+--------- -----------------+| datum a čas offset | datum a čas ||------------------------------------+----------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 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ístoCAST()
.DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime, @thedatetimeoffset); <'datetimeoffset') AS /před>Výsledek:
+------------------------------------+--------- -----------------+| datum a čas offset | datum a čas ||------------------------------------+----------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+