Tento článek obsahuje příklady převodu datum hodnotu na datetimeoffset hodnotu v SQL Server.
Když převedete datum hodnotu na datetimeoffset , jsou k hodnotě přidány další informace. Důvodem je datetimeoffset datový typ obsahuje informace o datu a čase a také informace o časovém posunu. Jinými slovy, datetimeoffset datový typ definuje datum, které je kombinováno s časem dne, který má povědomí o časovém pásmu a je založen na 24hodinovém formátu. Datum datový typ na druhé straně obsahuje pouze informace o datu.
Když převedeme z datum na datetimeoffset , čas (a posun časového pásma) se automaticky přičte k hodnotě. V případě potřeby však můžete hodnotu kdykoli změnit (včetně posunu časového pásma).
datetimeoffset datový typ také umožňuje určit přesnost na zlomky sekund. Pokud toto neurčíte, použije se stupnice 7. To znamená, že bude obsahovat 7 číslic na pravé straně desetinné čárky.
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datem a datetimeoffset .
DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7) SET @thedate = '2020-12-01' SET @thedatetimeoffset = @thedate SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset';
Výsledek:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
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 provádí implicitní převod v zákulisí, když se pokoušíme přiřadit datum hodnotu na datetimeoffset proměnná.
Vidíme, že datum proměnná obsahuje pouze informace o datu, zatímco datetimeoffset proměnná obsahuje informace o datu, čase a posunu časového pásma.
Při převodu mezi datem a datetimeoffset(7) (tj. pomocí stupnice 7) je časová složka nastavena na 00:00:00.0000000 +00:00
. Toto je také výchozí hodnota, takže můžete vynechat hodnotu přesnosti a použije stupnici 7 (což má za následek přesnost 34). Pokud chcete, můžete snížit přesnost. Snížení přesnosti může také snížit množství prostoru potřebného k uložení hodnoty.
Aby bylo jasno, škálování je počet číslic napravo od desetinné čárky v čísle. Přesnost je celkový počet číslic v čísle.
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 datem a datetimeoffset .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetimeoffset) AS 'datetimeoffset';
Výsledek:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
Dostaneme tedy stejný výsledek jako implicitní převod.
Čas můžeme také upravit takto:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS datetimeoffset)) AS 'datetimeoffset';
Výsledek:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 | +------------+------------------------------------+
Pamatujte, že nemůžete použít DATEADD()
funkce pro úpravu složky časového posunu. Ale nebojte se, existuje způsob, jak jej upravit (čtěte dále, abyste zjistili jak).
Příklad 3 – Explicitní převod pomocí CONVERT()
Zde je příklad explicitní konverze pomocí CONVERT()
funkce namísto CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetimeoffset, @thedate) AS 'datetimeoffset';
Výsledek:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
A úprava času:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(datetimeoffset, @thedate)) AS 'datetimeoffset';
Výsledek:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 | +------------+------------------------------------+
Příklad 4 – Úprava časového posunu
V předchozích příkladech jsme použili DATEADD()
funkce pro úpravu hodnoty času. Tuto funkci lze použít k úpravě jakékoli části složky data nebo času, kromě složky posunutí času .
Pokud potřebujete upravit časový posun, můžete použít TODATETIMEOFFSET()
funkce. Pomocí této funkce můžete také převést původní datum hodnotu na datetimeoffset hodnota. Tato funkce přijímá hodnotu data (kterou lze přeložit na datetime2 hodnotu) a hodnotu offsetu.
Zde je příklad:
DECLARE @thedate date, @thedatetimeoffset datetimeoffset SET @thedate = '2020-12-01' SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00') SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset';
Výsledek:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+
A zde je příklad použití funkce v rámci SELECT
prohlášení:
DECLARE @thedate date = '2020-12-01' SELECT @thedate AS 'date', TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';
Výsledek:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+
TODATETIMEOFFSET()
funkce také přijímá datetimeoffset value jako svůj první parametr, takže jej můžete použít také k úpravě stávajícího parametru datetimeoffset hodnoty v případě potřeby.
Příklad:
DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7) SET @thedate = '2020-12-01' SET @thedatetimeoffset = @thedate SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset', TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';
Výsledek:
+------------+------------------------------------+------------------------------------+ | date | datetimeoffset | Modified | |------------+------------------------------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+------------------------------------+