Database.Guide

Tento článek obsahuje příklady převodu hodnoty data na hodnotu smalldatetime v SQL Serveru.

Při převodu hodnoty data na smalldatetime se k hodnotě přidají další informace. Je to proto, že datový typ smalldatetime obsahuje jak informace o datu, tak o čase. Datový typ date naproti tomu obsahuje pouze informace o datu.

V některých případech však může převod data na smalldatetime selhat. Zejména pokud je hodnota data mimo rozsah podporovaný smalldatetime, pak převod selže s chybou.

V každém případě níže uvádíme příklady převodu mezi těmito dvěma datovými typy.

Příklad 1 – implicitní převod

Uvádíme příklad implicitního převodu mezi datem a smalldatetime.

DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSELECT @thedate AS 'date', @thesmalldatetime AS 'smalldatetime';

Výsledek:

+------------+---------------------+| date | smalldatetime ||------------+---------------------|| 2020-12-01 | 2020-12-01 00:00:00 |+------------+---------------------+

Jedná se o implicitní konverzi, protože k explicitnímu převodu nepoužíváme žádnou konverzní funkci (jako ty níže). V tomto případě SQL Server provádí implicitní konverzi v zákulisí, když se snažíme přiřadit hodnotu data do proměnné smalldatetime.

Vidíme, že proměnná date obsahuje pouze informaci o datu, zatímco proměnná smalldatetime obsahuje jak informaci o datu, tak o čase.

Při převodu mezi date a smalldatetime se časová složka nastaví na 00:00:00. Tím je zajištěna přesnost na minuty.

Důvodem, proč jsou to samé nuly, je to, že hodnota data neobsahuje žádnou časovou informaci, takže SQL Server nemá jak zjistit, jaký čas chcete (pokud vůbec nějaký).

Tento výsledek samozřejmě dostanete i v případě, že smalldatetime jednoduše přiřadíte hodnotu obsahující pouze datum, aniž byste provedli konverzi:

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 určit čas (ale zachovat stejné datum), můžete k tomu použít funkci DATEADD().

DECLARE @thedate date, @thesmalldatetime smalldatetimeSET @thedate = '2020-12-01'SET @thesmalldatetime = @thedateSET @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í převod pomocí CAST()

Tady je příklad explicitního převodu. V tomto případě používám funkci CAST() přímo v příkazu SELECT pro explicitní převod mezi datumem a smalldatetime.

DECLARE @thedate dateSET @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 u implicitního převodu.

Můžeme také upravit čas takto:

DECLARE @thedate dateSET @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()

Uvedeme příklad explicitního převodu pomocí funkce CONVERT() místo CAST().

DECLARE @thedate dateSET @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 dateSET @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ý datovým typem smalldatetime, zobrazí se chyba.

DECLARE @thedate dateSET @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.

Datový typ smalldatetime podporuje pouze rozsahy dat od 1900-01-01 do 2079-06-06. V případě, že se jedná o datový typ smalldatetime, je možné, že se jedná o datový typ smalldatetime.

Datový typ smalldatetime také podporuje pouze časové rozsahy 00:00:00 až 23:59:59, takže pokud se pokusíte použít hodnotu mimo tento rozsah (například s vyšší přesností), také dojde k chybě.

Příklad:

DECLARE @thedate dateSET @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ě se však nejedná o chybu při převodu, ale ve skutečnosti o chybu při použití funkce DATEADD() (protože funkce neumožňuje použití této konkrétní datové části na datovém typu smalldatetime).

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.