Tento článek obsahuje příklady převodu času hodnotu na smalldatetime hodnotu v SQL Server.
Když převedete čas hodnotu na smalldatetime , datum je nastaveno na „1900-01-01“ a hodnoty hodin a minut jsou zaokrouhleny nahoru. Sekundy a zlomky sekund jsou nastaveny na 0.
Příklad 1 – Explicitní konverze pomocí CAST()
Zde je příklad explicitní konverze. V tomto případě používám CAST()
funkce přímo v SELECT
příkaz explicitně převést z času do smalldatetime .
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Výsledek:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Přidá se tedy část data a nastaví se na „1900-01-01“ a v tomto případě se hodnoty minut zaokrouhlí nahoru a sekundy se nastaví na 0.
Dokumentace společnosti Microsoft uvádí, že zlomkové sekundy jsou také nastaveny na nulu, ale smalldatetime datový typ stejně nezahrnuje zlomky sekund.
Mimochodem, kdykoli použijete smalldatetime datový typ, složka sekund je vždy nastavena na 0.
Příklad 2 – Zaokrouhlování hodin nahoru
Zde je příklad hodiny zaokrouhlené nahoru:
DECLARE @thetime time(0); SET @thetime = '10:59:59'; SELECT @thetime AS 'time', CAST(@thetime AS smalldatetime) AS 'smalldatetime';
Výsledek:
+----------+---------------------+ | time | smalldatetime | |----------+---------------------| | 10:59:59 | 1900-01-01 11:00:00 | +----------+---------------------+
V tomto případě jsem také určil měřítko 0 pro hodnotu času, ale to neovlivňuje výsledek.
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. Když zadáme stupnici 0, znamená to, že není zahrnuta zlomková část.
Příklad 3 – Explicitní převod pomocí CONVERT()
Zde je příklad použití CONVERT()
funkce namísto CAST()
.
DECLARE @thetime time; SET @thetime = '23:15:59.1234567'; SELECT @thetime AS 'time', CONVERT(smalldatetime, @thetime) AS 'smalldatetime';
Výsledek:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Příklad 4 – Implicitní konverze
Zde je příklad provedení stejné věci, ale s použitím implicitní konverze typu.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Výsledek:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1900-01-01 23:16:00 | +------------------+---------------------+
Dostaneme tedy stejný výsledek bez ohledu na to, zda se jedná o explicitní nebo implicitní konverzi.
Jedná se o implicitní převod, protože k jeho explicitnímu převodu nepoužíváme konverzní funkci. Jednoduše přiřadíme hodnotu z proměnné jednoho datového typu k proměnné jiného datového typu. V tomto případě SQL Server provede implicitní převod za scénou, když se pokusíme přiřadit čas hodnotu na smalldatetime proměnná.
Příklad 5 – Změna data
Pokud potřebujete změnit datum (ale zachovat stejný čas), můžete použít DATEADD()
funkce.
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 85, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Výsledek:
+------------------+---------------------+ | time | smalldatetime | |------------------+---------------------| | 23:15:59.1234567 | 1985-01-01 23:16:00 | +------------------+---------------------+
V tomto případě přidám 85 k hodnotě roku, čímž se dostaneme na rok 1985.
Uvědomte si však, že smalldatetime podporuje velmi úzké časové období (1900-01-01 až 2079-06-06), takže přidání příliš velkého množství do roku může vést k chybě přetečení, jako je ta níže:
DECLARE @thetime time, @thesmalldatetime smalldatetime; SET @thetime = '23:15:59.1234567'; SET @thesmalldatetime = @thetime; SET @thesmalldatetime = DATEADD(year, 220, @thesmalldatetime); SELECT @thetime AS 'time', @thesmalldatetime AS 'smalldatetime';
Výsledek:
Adding a value to a 'smalldatetime' column caused an overflow.