Tento článek obsahuje příklady převodu datetimeoffset hodnotu na datetime2 v SQL Serveru.
Když převedete datetimeoffset hodnotu na datetime2 , datum a čas se zkopírují do datetime2 a časové pásmo je zkráceno. Zlomkové sekundy jsou také zkráceny, aby se vešly, pokud je přesnost cíle nižší.
datetimeoffset datový typ umožňuje zadat přesnost na zlomky sekund od 0 do 7 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.
datetime2 datový typ také umožňuje zadat přesnost na zlomky sekund od 0 do 7 (pomocí datetime2(n)
syntax). Nemá povědomí o časovém pásmu. Jeho velikost úložiště je buď 6, 7 nebo 8, v závislosti na použité přesnosti.
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 přidejte 1 bajt k částkám zde uvedeným, abyste získali úplnější obrázek o požadavcích na úložiště.
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datetimeoffset a datetime2 .
DECLARE @thedatetimeoffset datetimeoffset, @thedatetime2 datetime2;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetimeoffset;SELECT @thedatetimeoffset AS 'datetimeoffset AS 'datetimeoffset AS 'datetime2';
Výsledek:
+------------------------------------+--------- ---------------------+| datum a čas offset | datetime2 ||------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 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 na datetime2 proměnná.
V tomto příkladu oba datové typy používají výchozí přesnost (7 desetinných míst). Proto zlomková část byla 1234567 pro oba výsledky.
Také vidíme, že byl zkrácen posun časového pásma – datetime2 datový typ nemá povědomí o časovém pásmu.
Při tomto převodu se velikost úložiště zmenšila z 10 bajtů (pro datetimeoffset ) na 8 bajtů (pro datetime2 ), i když si uvědomte, že za účelem uložení přesnosti je přidán 1 bajt.
Příklad 2 – Rozdílná přesnost
Zde je příklad, který ukazuje, co se stane, když datetime2 hodnota používá nižší přesnost než datetimeoffset hodnotu.
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thedatetime2 =@thedatetimeoffset;VYBRAT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';
Výsledek:
+------------------------------------+--------- -----------------+| datum a čas offset | datetime2 ||------------------------------------+---------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+
V tomto příkladu datetimeoffset má stupnici 7
ale datetime2 hodnota má stupnici jen 3
. Proto byly zlomkové sekundy zkráceny, aby se vešly.
Všimněte si, že to může způsobit zaokrouhlování. Zde je příklad, kde zlomková část datetime2 hodnota se zaokrouhlí nahoru na 124 .
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1235555 +07:00';SET @thedatetime2 =@thedatetimeoffset;VYBRAT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';
Výsledek:
+------------------------------------+--------- -----------------+| datum a čas offset | datetime2 ||------------------------------------+---------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 |+------------------------------------+- ------------------------+
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 datetime2 .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime2';Výsledek:
+------------------------------------+--------- ---------------------+| datum a čas offset | datetime2 ||------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-------------------------------------+- ----------------------------+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(datetime2, @thedatetimedateoffset) AS;' /před>Výsledek:
+------------------------------------+--------- ---------------------+| datum a čas offset | datetime2 ||------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-------------------------------------+- ----------------------------+