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

Převést „smalldatetime“ na „čas“ v SQL Server (příklady T-SQL)

Tento článek obsahuje příklady převodu smalldatetime hodnotu k času hodnotu v SQL Server.

Když převedete smalldatetime hodnotu k času , ztratíte rande. Hodiny, minuty a sekundy se zkopírují. Zlomkové sekundy jsou nastaveny na 0.

smalldatetime datový typ zahrnuje datum i čas. Čas však nemá žádné zlomkové sekundy a jeho složka sekund je vždy nastavena na nulu (:00). Jeho přesnost je s přesností na minutu. Velikost jeho úložiště je 4 bajty.

Čas datový typ na druhé straně zahrnuje pouze čas. Umožňuje však zadat přesnost na zlomky sekund od 0 do 7. Toho je dosaženo použitím času (n ) syntaxe, kde n je stupnice od 0 do 7. Pokud toto neurčíte, použije se 7 (výchozí), která poskytuje přesnost 100 nanosekund. Pokud zadáte nulu (0 ), jeho přesnost bude na nejbližší sekundu. Jeho velikost úložiště bude buď 3, 4 nebo 5 bajtů (plus 1 bajt pro uložení přesnosti), v závislosti na přesnosti ve zlomcích sekund.

Příklad 1 – Implicitní konverze

Zde je příklad implicitní konverze mezi datetime a čas .

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Výsledek:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:16: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 provede implicitní převod za scénou, když se pokusíme přiřadit smalldatetime hodnotu k času proměnná.

Nejzřetelnější věcí na tomto výsledku je čas hodnota nezahrnuje datum. To se dá očekávat, protože čas datový typ je určen pouze pro ukládání časových hodnot, nikoli datových hodnot.

Co není zřejmé (alespoň s mým příkladem) je, že časová hodnota skutečně zvládne část se zlomky sekund. Můj systém zde nezobrazuje zlomkové sekundy, ale další příklad ukáže, že ve skutečnosti má přesnost zlomku sekund 7.

Pokud se také podíváte pozorně, uvidíte, že smalldatetime hodnota zaokrouhlená na minuty nahoru od skutečné hodnoty, kterou jsem se jí snažil přiřadit. To odráží relativně nízkou přesnost smalldatetime datový typ. Jeho přesnost je s přesností na minutu. Zjevným důsledkem toho je, že když nakonec jeho hodnotu přiřadíme času datový typ, je to přiřazená zaokrouhlená hodnota – nikoli počáteční hodnota, kterou jsem se snažil přiřadit. Pokud bychom počáteční hodnotu přiřadili přímo času proměnnou, dostali bychom přesnější hodnotu (i kdybychom zadali stupnici 0).

Zde je to, co mám na mysli:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time(0);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'time';

Výsledek:

+---------------------+----------+
| smalldatetime       | time     |
|---------------------+----------|
| 2025-05-21 10:16:00 | 10:15:30 |
+---------------------+----------+

Příklad 2 – Přidání zlomků sekund

smalldatetime datový typ nemá část ve zlomcích sekund, ale v našem prvním příkladu čas hodnota má přesnost ve zlomcích sekund 7 (i když ve skutečnosti nezobrazuje žádná desetinná místa). Znám jeho přesnost, protože jsem při jeho deklaraci nespecifikoval měřítko, proto používá své výchozí měřítko 7.

Zde je příklad, který potvrzuje, že čas hodnota může ve skutečnosti podporovat zlomkovou část:

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thetime time;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thetime = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thetime AS 'Original time',
  DATEADD(nanosecond, 123456700, @thetime) AS 'Modified time';

Výsledek:

+---------------------+-----------------+------------------+
| smalldatetime       | Original time   | Modified time    |
|---------------------+-----------------+------------------|
| 2025-05-21 10:16:00 | 10:16:00        | 10:16:00.1234567 |
+---------------------+-----------------+------------------+

Všimněte si, že když je čas value má stupnici 7, má velikost úložiště 5 bajtů. Proto má vyšší požadavky na úložiště než smalldatetime typu (který používá pouze 4 bajty).

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 smalldatetime a čas .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CAST(@thesmalldatetime AS time(0)) AS 'time(0)';

Výsledek:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

V tomto příkladu jsem nastavil měřítko na 0.

Příklad 4 – Explicitní převod pomocí CONVERT()

Zde je příklad explicitní konverze pomocí CONVERT() funkce namísto CAST() .

DECLARE @thesmalldatetime smalldatetime;
SET @thesmalldatetime = '2025-05-21 10:15:30.125';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  CONVERT(time(0), @thesmalldatetime) AS 'time(0)';

Výsledek:

+---------------------+-----------+
| smalldatetime       | time(0)   |
|---------------------+-----------|
| 2025-05-21 10:16:00 | 10:16:00  |
+---------------------+-----------+

  1. Základy paralelního programování s rámcem Fork/Join v Javě

  2. Hekaton s twistem:TVP v paměti – část 2

  3. Syntaxe MySQL pro Join Update

  4. SQL Server 2016:Návrhář zobrazení