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

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

Pokud máte datetimeoffset hodnotu, ale nepotřebujete část posunutí data a časového pásma, převedete ji na čas vám ušetří spoustu místa v úložišti (a zároveň odstraní zbytečné detaily z hodnoty). Tento článek obsahuje příklady převodu datetimeoffset hodnotu k času hodnotu v SQL Server.

datetimeoffset datový typ zahrnuje datum a čas s posunem časového pásma. Má také zlomkovou sekundovou část mezi 0 a 7 (to závisí na tom, kolik zlomkových sekund je jí přiřazeno). To se provádí pomocí datetimeoffset(n) syntax. Pokud toto nezadáte, použije se 7 (výchozí). Velikost úložiště tohoto typu dat je buď 8, 9 nebo 10 bajtů, v závislosti na použité přesnosti. Jeho přesnost je 100 nanosekund.

Čas datový typ na druhé straně zahrnuje pouze čas. Nezahrnuje datum a nezahrnuje posun časového pásma. Nicméně podobně jako datetimeoffset také vám umožňuje zadat část ve zlomcích sekund mezi 0 a 7 (pomocí time(n) syntax). Používá buď 3, 4 nebo 5 bajtů, v závislosti na jeho přesnosti.

Když převedete datetimeoffset hodnotu k času datový typ, ztratíte část data. Ztratíte také posun časového pásma. Můžete však také snížit velikost úložiště z 8 až 10 bajtů na 3, 4 nebo 5 bajtů. Tento převod byste však provedli pouze v případě, že nepotřebujete část data nebo posun časového pásma.

Všimněte si, že částky úložiště uvedené zde jsou částky uvedené v dokumentaci společnosti Microsoft. Tyto datové typy však také používají 1 bajt k uložení přesnosti. Proto budete muset k částkám uvedeným zde přidat 1 bajt.

Příklad 1 – Implicitní konverze

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

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thetime time;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Výsledek:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

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 datetimeoffset hodnotu k času proměnná.

Zde vidíme, že čas hodnota zahrnuje pouze čas (bez složky data). Komponenty posunu data a časového pásma byly z hodnoty odstraněny.

V tomto příkladu oba datové typy používají výchozí přesnost (což má za následek 7 desetinných míst). Výsledkem je datetimeoffset hodnotu pomocí 10 bajtů a času hodnotu pomocí 5 bajtů.

Příklad 2 – Přesnost

Přesný výsledek bude záviset na nastavení přesnosti pro každý typ dat. V dalším příkladu čas hodnota používá nižší přesnost než původní datetimeoffset hodnota:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Výsledek:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1230000 |
+------------------------------------+------------------+

Můj systém zobrazuje koncové nuly, ale jde o to, že čas value má nyní přesnost na pouhá 3 desetinná místa ve srovnání se 7 desetinnými místy, které používá původní hodnota.

Snížení přesnosti může mít také za následek čas hodnota se zaokrouhluje nahoru. Zde je příklad:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thetime time(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.1235555 +10:30';
SET @thetime = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thetime AS 'time';

Výsledek:

+------------------------------------+------------------+
| datetimeoffset                     | time             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1240000 |
+------------------------------------+------------------+

V tomto případě skončíme se zlomkovou částí 124 místo 123 , protože následující číslice byla 5 nebo větší.

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

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS time) AS 'time'; 

Výsledek:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

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

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

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(time, @thedatetimeoffset) AS 'time'; 

Výsledek:

+------------------------------------+------------------+
| datetimeoffset                     | date             |
|------------------------------------+------------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 10:15:30.1234567 |
+------------------------------------+------------------+

  1. Pivot na více sloupců pomocí Tablefunc

  2. Jak se mohu připojit k serveru SQL z počítače Mac s PHP PDO?

  3. Jak zkontrolovat stav PostgreSQL serveru Mac OS X

  4. Funkce CHARTOROWID() v Oracle