sql >> Databáze >  >> RDS >> Sqlserver

datetime vs smalldatetime v SQL Server:Jaký je rozdíl?

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               |
+------------+-----------------+

  1. Nelze se připojit k PostgreSQL pomocí PHP pg_connect()

  2. Spusťte SQL z dávkového souboru

  3. Vyřešte chybu PLS-00323 v Oracle

  4. Dochází k zásahu do výkonu pomocí desítkových datových typů (MySQL / Postgres)