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

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

Tento článek obsahuje příklady převodu datetime2 hodnotu na datetimeoffset hodnotu v SQL Server.

Když převedete datetime2 hodnotu na datetimeoffset , bude výsledná hodnota záviset na přesnosti ve zlomcích sekund, která je přiřazena každému datovému typu, a také na libovolném posunutí časového pásma, které určíte.

Oba datové typy umožňují zadat přesnost na zlomky sekund od 0 do 7. Pokud toto neuvedete, použije se výchozí měřítko 7.

datetimeoffset datový typ obsahuje posun časového pásma a může zachovat jakékoli posuny v původní hodnotě. Nicméně datetime2 nemá povědomí o časovém pásmu, takže neexistují žádné existující hodnoty k zachování. V tomto případě je výchozí nastavení časového pásma +00:00.

TODATETIMEOFFSET() funkce byla speciálně navržena pro převod hodnoty data/času na datetimeoffset a přidejte posun časového pásma. Viz mé komentáře (a příklady) níže týkající se této možnosti.

Příklad 1 – Implicitní konverze

Nejprve je zde příklad implicitní konverze mezi datetime2 a datetimeoffset .

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Výsledek:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset(7)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00: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 datetime2 hodnotu na datetimeoffset proměnná.

Vidíme, že datetimeoffset proměnná dokáže používat stejnou přesnost jako datetime2 hodnotu (7 desetinných míst). Také skončíme s posunem časového pásma +00:00 .

Použití přesnosti na 7 zlomků sekund způsobí datetimeoffset použít 11 bajtů pro úložiště (10 pro data a 1 bajt pro přesnost). datetime2 typ používá 9 bajtů (8 pro data a 1 bajt pro přesnost) při použití měřítka 7.

Přesnost však můžete snížit nahrazením 7 nižším číslem.

Příklad 2 – Zaokrouhlení

Pokud datetimeoffset má nižší přesnost než datetime2 hodnota, bude zaokrouhlena nahoru.

Zde je příklad:

DECLARE 
  @thedatetime2 datetime2(7), 
  @thedatetimeoffset datetimeoffset(6);
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2(7)',
  @thedatetimeoffset AS 'datetimeoffset(6)';

Výsledek:

+-----------------------------+------------------------------------+
| datetime2(7)                | datetimeoffset(6)                  |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234570 +00:00 |
+-----------------------------+------------------------------------+

V tomto příkladu datetime2 hodnota má stupnici 7, ale datetimeoffset měřítko hodnoty je pouze 6. Proto je její přesnost pouze na 6 desetinných míst a její šestá číslice se zaokrouhluje nahoru na 7 (místo 6).

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 datetime2 a datetimeoffset .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetimeoffset) AS 'datetimeoffset';

Výsledek:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

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

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

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetimeoffset, @thedatetime2) AS 'datetimeoffset';

Výsledek:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +00:00 |
+-----------------------------+------------------------------------+

Příklad 5 – Změna posunu časového pásma

Pokud převádíte z datetime2 na datetimeoffset , pravděpodobně to děláte pro posun časového pásma. Je také vysoce pravděpodobné, že budete potřebovat jinou hodnotu než výchozí +00:00.

Naštěstí můžete použít TODATETIMEOFFSET() funkce pro změnu offsetu.

Pomocí této funkce můžete také převést původní datetime2 hodnotu na datetimeoffset hodnota. Tato funkce přijímá jakoukoli hodnotu data/času, kterou lze přeložit na datetime2 hodnotu a hodnotu offsetu.

Zde je příklad:

DECLARE @thedatetime2 datetime2, @thedatetimeoffset datetimeoffset;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedatetime2, '+07:00');
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetimeoffset AS 'datetimeoffset';

Výsledek:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

A zde je příklad použití funkce v rámci SELECT prohlášení:

DECLARE @thedatetime2 datetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  TODATETIMEOFFSET(@thedatetime2, '+07:00') AS 'datetimeoffset';

Výsledek:

+-----------------------------+------------------------------------+
| datetime2                   | datetimeoffset                     |
|-----------------------------+------------------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.1234567 +07:00 |
+-----------------------------+------------------------------------+

Jeden důležitý bod o TODATETIMEOFFSET() Funkce spočívá v tom, že používá stejnou zlomkovou přesnost jako argument datum/čas, který je jí předán.

Pokud tedy vaše datetime2 používá nižší přesnost než datetimeoffset , můžete jej vždy znovu přiřadit k proměnné s vyšší přesností a poté předat převedenou hodnotu do TODATETIMEOFFSET() .

Příklad:

DECLARE @lowprecision datetime2(3), @highprecision datetime2(7);
SET @lowprecision = '2025-05-21 10:15:30.123';
SET @highprecision = @lowprecision;
SELECT 
  @lowprecision AS 'lowprecision',
  @highprecision AS 'highprecision',
  TODATETIMEOFFSET(@highprecision, '+07:00') AS 'Modified';

Výsledek (při použití vertikálního výstupu):

lowprecision  | 2025-05-21 10:15:30.123
highprecision | 2025-05-21 10:15:30.1230000
Modified      | 2025-05-21 10:15:30.1230000 +07:00

  1. Oracle:sekvence MySequence.currval ještě není v této relaci definována

  2. Jak CEILING() funguje v MariaDB

  3. Vytvoření kopie databáze v PostgreSQL

  4. Jak povolím, aby parametr rozevíracího seznamu v SSRS měl výchozí hodnotu -- All -- ?