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

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

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

Jedna z výhod převodu data a času hodnotu k času spočívá v tom, že zmenšíte velikost úložiště z 8 bajtů na 3, 4 nebo 5 bajtů (v závislosti na přesnosti, kterou používáte pro čas hodnota). Přesně řečeno, čas používá 4, 5 nebo 6 bajtů, protože k uložení jeho přesnosti se používá bajt navíc.

Když převedete datum a čas hodnotu k času , zkopíruje se pouze časová část hodnoty. Přesný výsledek bude záviset na přesnosti ve zlomcích sekund, kterou přiřadíte času . Když je čas přesnost je menší než datum a čas přesnost, zlomky sekund se zaokrouhlí nahoru, aby odpovídaly času přesnost.

datum a čas datový typ má maximálně 3 číslice ve zlomcích sekund. Jeho přesnost je zaokrouhlena na 0,000, 003 nebo 007 sekund.

Čas datový typ vám na druhé straně umožňuje zadat přesnost na zlomky sekund od 0 do 7. Toho je dosaženo použitím time(n ) syntaxe, kde n je stupnice od 0 do 7. Pokud toto neurčíte, použije se 7, která poskytuje přesnost 100 nanosekund.

Příklad 1 – Implicitní konverze

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

DECLARE 
  @thedatetime datetime, 
  @thetime time;
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Výsledek:

+-------------------------+------------------+
| datetime                | time             |
|-------------------------+------------------|
| 2025-05-21 10:15:30.123 | 10:15:30.1233333 |
+-------------------------+------------------+

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 datetime 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.

Můžeme také vidět, že čas proměnná má větší přesnost ve zlomcích sekund a my skončíme u zlomkové části 1233333 (vs 123 pro datum a čas hodnota). To se děje, protože čas hodnota používá výchozí měřítko 7 (protože jsme měřítko explicitně neurčili).

Příklad 2 – Zaokrouhlení

datum a čas datový typ se zaokrouhlí na přírůstky 0,000, 003 nebo 0,007 sekund. I když ji výslovně nastavíte na jinou hodnotu, bude zaokrouhlena.

Zde je příklad:

DECLARE 
  @thedatetime datetime, 
  @thetime time;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'thetime';

Výsledek:

+-------------------------+------------------+
| datetime                | thetime          |
|-------------------------+------------------|
| 2025-05-21 10:15:30.127 | 10:15:30.1266667 |
+-------------------------+------------------+

V tomto příkladu jsem nastavil zlomkové sekundy na 125 ale datum a čas zaokrouhleno nahoru na 127 (protože jej lze zaokrouhlit pouze na přírůstky 0,000, 003 nebo 0,007 sekund).

Čas hodnotu však nastavte zlomkové sekundy na 1266667 .

Pokud bychom jednoduše nastavili počáteční hodnotu na čas za prvé, jeho zlomková část by vrátila 1250000 .

Příklad 3 – Přesnost/přesnost

Jak již bylo zmíněno, čas datový typ umožňuje určit přesnost na zlomky sekund. Pokud to neuděláte, použije 7 (proto předchozí příklad používá 7).

Toto můžete upravit pomocí času (n ) syntax. Proto jsem mohl použít time(7) pro předchozí příklady získat stejný výsledek.

V tomto příkladu odstraním zlomkové sekundy úplně pomocí time(0) :

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Výsledek:

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.127 | 10:15:30 |
+-------------------------+----------+

Když to uděláme, velikost úložiště čas hodnota je snížena na 3 bajty (4 bajty včetně přesnosti) na rozdíl od 8 bajtů pro datetime hodnota.

Uvědomte si, že použití nižší přesnosti, než je původní hodnota, způsobí zaokrouhlení výsledku nahoru, aby odpovídal zadané přesnosti.

Příklad:

DECLARE 
  @thedatetime datetime, 
  @thetime time(0);
SET @thedatetime = '2025-05-21 10:15:30.525';
SET @thetime = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thetime AS 'time';

Výsledek:

+-------------------------+----------+
| datetime                | time     |
|-------------------------+----------|
| 2025-05-21 10:15:30.527 | 10:15:31 |
+-------------------------+----------+

Příklad 4 – Explicitní převod 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 datetime a čas .

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

Výsledek:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 10:15:30  |
+-------------------------+-----------+

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

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

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

Výsledek:

+-------------------------+-----------+
| datetime                | time(0)   |
|-------------------------+-----------|
| 2025-05-21 10:15:30.127 | 10:15:30  |
+-------------------------+-----------+

  1. Tipy pro správu zálohování pro TimescaleDB

  2. Použití serveru SQL jako úložiště obrázků

  3. UPPER() – Převod na velká písmena v PostgreSQL

  4. Jak nakonfigurovat Ruby on Rails s Oracle?