Tento článek obsahuje příklady převodu datum hodnotu na datetime2 hodnotu v SQL Server.
Když převedete datum hodnotu na datetime2 , jsou k hodnotě přidány další informace. Důvodem je datetime2 datový typ obsahuje informace o datu i čase. Datum datový typ na druhé straně obsahuje pouze informace o datu.
datetime2 datový typ je v podstatě rozšířením datetime datový typ. Má větší rozsah dat, větší výchozí zlomkovou přesnost a volitelnou přesnost zadanou uživatelem.
V každém případě je proces převodu naprosto stejný bez ohledu na typ dat. Jediný rozdíl je v množství informací, které jsou k dispozici mezi datem , datum a čas a datetime2 .
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datem a datetime2 .
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Výsledek:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
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 datum hodnotu na datetime2 proměnná.
Vidíme, že datum proměnná obsahuje pouze informace o datu, zatímco datetime2 proměnná obsahuje informace o datu i čase.
Navíc získáme více informací o čase, než bychom získali, kdybychom je převedli na datetime datový typ.
Při převodu mezi datem a datetime2 pomocí výchozí přesnosti (7) je časová složka nastavena na 00:00:00.0000000
(ve srovnání s 00:00:00.000
pro datum a čas ). Pokud chcete, můžete přesnost snížit (viz níže). Snížení přesnosti může také snížit množství prostoru potřebného k uložení hodnoty.
Důvod, proč je časová složka samé nuly, je ten, že hodnota data neobsahuje žádné časové informace, takže SQL Server nemůže nijak zjistit, jaký čas chcete (pokud nějaký).
Příklad 2 – Úprava času
Pokud potřebujete zadat čas (ale zachovat stejné datum), můžete použít DATEADD()
funkce udělat právě to.
DECLARE @thedate date, @thedatetime2 datetime2 SET @thedate = '2020-12-01' SET @thedatetime2 = @thedate SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2) SELECT @thedate AS 'date', @thedatetime2 AS 'datetime2';
Výsledek:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
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 datem a datetime2 .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetime2) AS 'datetime2';
Výsledek:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
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, 8, CAST(@thedate AS datetime2)) AS 'datetime2';
Výsledek:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Příklad 4 – 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(datetime2, @thedate) AS 'datetime2';
Výsledek:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 | +------------+-----------------------------+
A úprava času:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';
Výsledek:
+------------+-----------------------------+ | date | datetime2 | |------------+-----------------------------| | 2020-12-01 | 2020-12-01 08:00:00.0000000 | +------------+-----------------------------+
Příklad 5 – Přesnost
datetime2 datový typ umožňuje určit přesnost (až do výchozích 7). Jinými slovy, pokud nepotřebujete, nemusíte používat celých 7 číslic.
Příklad:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetime2(2), @thedate) AS 'datetime2(2)', CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';
Výsledek:
+------------+------------------------+--------------------------+ | date | datetime2(2) | datetime2(4) | |------------+------------------------+--------------------------| | 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 | +------------+------------------------+--------------------------+
Jednou z výhod snížení přesnosti je, že může také snížit množství prostoru potřebného k uložení hodnoty. Konkrétně 6 bajtů pro přesnost menší než 3, 7 bajtů pro přesnost 3 nebo 4 a všechny ostatní přesnosti vyžadují 8 bajtů. Pamatujte však, že první bajt se používá k uložení přesnosti, takže skutečná hodnota je zde uvedená velikost úložiště plus 1 další bajt pro uložení přesnosti.