Tento článek obsahuje příklady převodu datum hodnotu na smalldatetime hodnotu v SQL Server.
Když převedete datum hodnotu na smalldatetime , jsou k hodnotě přidány další informace. Důvodem je smalldatetime datový typ obsahuje informace o datu i čase. Datum datový typ na druhé straně obsahuje pouze informace o datu.
Existují však případy, kdy rande do smalldatetime konverze může selhat. Zejména pokud datum hodnota je mimo rozsah podporovaný smalldatetime pak to selže s chybou.
V každém případě jsou níže uvedeny příklady převodu mezi těmito dvěma datovými typy.
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datem a smalldatetime .
DECLARE @thedate date, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Výsledek:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00: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 smalldatetime proměnná.
Vidíme, že datum proměnná obsahuje pouze informace o datu, zatímco smalldatetime proměnná obsahuje informace o datu i čase.
Při převodu mezi datem a smalldatetime , časová složka je nastavena na 00:00:00
. To zajišťuje přesnost na minutu.
Důvod, proč jsou všechny nuly, je ten, že hodnota data neobsahuje žádné časové informace, takže SQL Server nemůže nijak zjistit, jaký čas chcete (pokud nějaký).
Tento výsledek samozřejmě také získáte, i když k smalldatetime jednoduše přiřadíte hodnotu pouze pro datum bez provedení konverze:
DECLARE @thesmalldatetime smalldatetime = '2020-12-01' SELECT @thesmalldatetime AS 'smalldatetime';
Výsledek:
+---------------------+ | smalldatetime | |---------------------| | 2020-12-01 00:00:00 | +---------------------+
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, @thesmalldatetime smalldatetime SET @thedate = '2020-12-01' SET @thesmalldatetime = @thedate SET @thesmalldatetime = DATEADD(hour, 7, @thesmalldatetime) SELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';
Výsledek:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
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 smalldatetime .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Výsledek:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
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 smalldatetime)) AS 'smalldatetime';
Výsledek:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
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(smalldatetime, @thedate) AS 'smalldatetime';
Výsledek:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 00:00:00 | +------------+---------------------+
A úprava času:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(smalldatetime, @thedate)) AS 'smalldatetime';
Výsledek:
+------------+---------------------+ | date | smalldatetime | |------------+---------------------| | 2020-12-01 | 2020-12-01 07:00:00 | +------------+---------------------+
Příklad 5 – Chyba mimo rozsah
Jak již bylo zmíněno, pokud je datum mimo rozsah podporovaný smalldatetime datový typ, zobrazí se chyba.
DECLARE @thedate date SET @thedate = '2080-12-01' SELECT @thedate AS 'date', CAST(@thedate AS smalldatetime) AS 'smalldatetime';
Výsledek:
The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.
smalldatetime datový typ podporuje pouze časové rozsahy 1900-01-01 až 2079-06-06.
Také smalldatetime datový typ podporuje pouze časové rozsahy 00:00:00 až 23:59:59, takže se také zobrazí chyba, pokud se pokusíte použít hodnotu mimo tento rozsah (například s vyšší přesností).
Příklad:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(nanosecond, 7, CAST(@thedate AS smalldatetime)) AS 'smalldatetime';
Výsledek:
The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.
V tomto případě však nejde o chybu při převodu, ve skutečnosti jde o chybu při použití DATEADD()
funkce (protože funkce neumožňuje použití konkrétní části data v smalldatetime datový typ).