Tento článek zkoumá hlavní rozdíly mezi datetime a smalldatetime datové typy na serveru SQL.
Oba datové typy se používají pro ukládání hodnot data a času, existují však mezi nimi rozdíly. Ve většině případů je lepší vyhnout se oběma typům a používat datetime2 místo toho (Microsoft to také doporučuje). V každém případě je zde srovnání těchto dvou datových typů.
Následující tabulka uvádí některé klíčové podobnosti a rozdíly mezi těmito dvěma datovými typy.
Funkce | smalldatetime | datum a čas |
---|---|---|
Vyhovující SQL (ANSI &ISO 8601) | Ne | Ne |
Časové období | 1900-01-01 až 2079-06-06 | 1753-01-01 až 9999-12-31 |
Časový rozsah | 00:00:00 až 23:59:59 | 00:00:00 až 23:59:59.997 |
Délka znaků | Maximálně 19 pozic | Minimálně 19 pozic Maximálně 23 |
Velikost úložiště | 4 bajty, opraveno | 8 bajtů, opraveno |
Přesnost | Jedna minuta | Zaokrouhleno na přírůstky 0,000, 003 nebo 007 sekund |
Zlomková sekundová přesnost | Ne | Ano |
Uživatelsky definovaná přesnost na zlomek sekund | Ne | Ne |
Posun časového pásma | Žádné | Žádné |
Sledování a zachování posunu časového pásma | Ne | Ne |
Sledování letního času | Ne | Ne |
Mám použít „datetime“ nebo „smalldatetime“?
Společnost Microsoft nedoporučuje používat oba tyto typy dat pro novou práci. Měli byste je používat pouze v případě, že k tomu máte pádný důvod.
Ale pokud byste si museli vybrat, vaše rozhodnutí by pravděpodobně bylo učiněno zvážením mimořádné přesnosti a přesnosti datetime oproti nižším požadavkům na úložiště smalldatetime .
Jinými slovy, pokud nepotřebujete přesnost na sekundy, smalldatetime odvede svou práci a využije pouze polovinu úložného prostoru. Na druhou stranu, pokud potřebujete přesnost na sekundy (nebo dokonce několik zlomkových sekund), budete muset použít datetime .
Microsoft každopádně doporučuje používat datum , čas , datetime2 nebo datetimeoffset pro novou práci.
Viz smalldatetime vs datetime2 a datum a čas vs datetime2 abyste viděli, jak se jednotlivé typy porovnávají s datetime2 .
Příklad 1 – Základní srovnání
Zde je rychlý příklad demonstrující základní rozdíl mezi datetime a smalldatetime .
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = @thedatetime; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Výsledek:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Zde nastavím smalldatetime proměnnou na stejnou hodnotu jako datetime variabilní. To způsobí, že se hodnota převede na smalldatetime a pak můžeme použít SELECT
příkaz, abyste viděli skutečnou hodnotu, která byla přiřazena každé proměnné.
V tomto případě obě proměnné zaokrouhlí hodnotu nahoru. Ale jsou zaokrouhleny jinak.
datum a čas proměnná zaokrouhluje část ve zlomcích sekund nahoru. Důvodem je datum a čas vždy zaokrouhluje na přírůstky 0,000, 003 nebo 007 sekund.
smalldatetime proměnná na druhé straně zaokrouhluje minuty nahoru část. Nejen to, sekundová část je nastavena na nulu. Dá se to očekávat, protože oficiální dokumentace společnosti Microsoft uvádí, že smalldatetime
Čas je …založen na 24hodinovém dni, přičemž sekundy jsou vždy nula (:00) a bez zlomkových sekund
.
Vidíme tedy, že datum a čas type poskytuje přesnější a přesnější hodnotu data/času.
Příklad 2 – Nastavení hodnot z řetězcových literálů
V předchozích příkladech smalldatetime hodnota byla přiřazena nastavením na stejnou hodnotu jako datetime hodnota. Když to uděláme, SQL Server provede implicitní převod, aby data „seděla“ novému datovému typu.
Jak se ukázalo, můžeme také nastavit smalldatetime proměnnou na stejný řetězcový literál, který obsahuje zlomkové sekundy (i když tento datový typ neukládá zlomkové sekundy).
Zde je příklad, kde to dělám:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.555'; SET @thesmalldatetime = '2025-05-21 10:15:30.555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Výsledek:
+-------------------------+---------------------+ | datetime | smalldatetime | |-------------------------+---------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:16:00 | +-------------------------+---------------------+
Výsledek je samozřejmě stejný, když vybereme hodnoty – smalldatetime hodnota neukazuje žádné zlomkové sekundy, sekundy jsou nula a minuty jsou zaokrouhleny nahoru.
Pokud však použijeme více než 3 desetinná místa, oba datové typy vrátí chybu.
Chyba pro datetime :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Výsledek:
Msg 241, Level 16, State 1, Line 4 Conversion failed when converting date and/or time from character string.
Chyba pro smalldatetime :
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.5555'; SET @thesmalldatetime = '2025-05-21 10:15:30.5555'; SELECT @thedatetime AS 'datetime', @thesmalldatetime AS 'smalldatetime';
Výsledek:
Msg 295, Level 16, State 3, Line 5 Conversion failed when converting character string to smalldatetime data type.
Příklad 3 – Velikost úložiště
smalldatetime datový typ má pevnou velikost úložiště 4 bajty. Toto je jedna z mála výhod smalldatetime má více než datum a čas , který má pevnou velikost úložiště 8 bajtů.
Velikost úložiště můžeme zkontrolovat pomocí DATALENGTH()
funkce, která vrátí počet bajtů použitých pro každou z našich hodnot:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(@thedatetime) AS 'datetime', DATALENGTH(@thesmalldatetime) AS 'smalldatetime';
Výsledek
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+
Stejný výsledek dostaneme, i když je převedeme na varbinary , což více vystihuje, jak jsou ve skutečnosti uloženy v databázi:
DECLARE @thedatetime datetime, @thesmalldatetime smalldatetime; SET @thedatetime = '2025-05-21 10:15:30.123'; SET @thesmalldatetime = @thedatetime; SELECT DATALENGTH(CAST(@thedatetime AS varbinary(10))) AS 'datetime', DATALENGTH(CAST(@thesmalldatetime AS varbinary(10))) AS 'smalldatetime';
Výsledek
+------------+-----------------+ | datetime | smalldatetime | |------------+-----------------| | 8 | 4 | +------------+-----------------+