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

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

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

Když převedete datum a čas hodnotu na datetimeoffset , bude výsledná hodnota záviset na přesnosti ve zlomcích sekund, kterou přiřadíte datetimeoffset , stejně jako jakékoli posunutí časového pásma, které určíte.

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.

datetimeoffset datový typ vám na druhé straně umožňuje zadat přesnost ve zlomcích sekund od 0 do 7. Pokud toto nezadáte, použije se 7 (výchozí). Má také posun časového pásma a může zachovat jakékoli posuny v původní hodnotě. Nicméně datum a čas 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.

SQL Server má ve skutečnosti TODATETIMEOFFSET() funkce, která je speciálně navržena pro převod hodnoty data/času na datetimeoffset a přidejte posun časového pásma. Při používání této funkce je však třeba si uvědomit jeden jemný detail, který vysvětluji níže (s příklady).

Příklad 1 – Implicitní konverze

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

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.123';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Výsledek:

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

Vidíme, že datetimeoffset 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). Také skončíme s posunem časového pásma +00:00 .

Použití přesnosti na 7 zlomků sekund způsobí datetimeoffset použít 10 bajtů pro úložiště (11 bajtů, pokud zahrnete bajt, ve kterém je uložena jeho přesnost). Pro srovnání datum a čas používá pouze 8 bajtů. Můžete však snížit přesnost datetimeoffset hodnotu nahrazením 7 nižším číslem. Jedná se o stejný koncept jako při použití datetime2 datový typ. Příklady toho, jak to může ovlivnit konečný výsledek, najdete v tématu Převod ‚datetime‘ na ‚datetime2‘ v SQL Server.

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. To by vám mohlo způsobit spoustu zmatku, pokud si nejste vědomi toho, jak to funguje. Nejen, že to může způsobit zmatek při použití datetime sám o sobě může způsobit další zmatek při převodu této hodnoty na jiný datový typ.

Zde je příklad, který ukazuje, co tím myslím.

DECLARE 
  @thedatetime datetime, 
  @thedatetimeoffset datetimeoffset;
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Výsledek:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

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

datetimeoffset hodnotu na druhé straně, nastavte zlomkové sekundy na 1266667 .

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

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

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

Výsledek:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

Příklad 4 – 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(datetimeoffset(7), @thedatetime) AS 'datetimeoffset(7)';

Výsledek:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1266667 +00:00 |
+-------------------------+------------------------------------+

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

Pokud se pustíte do všech potíží s převodem data a času hodnoty na datetimeoffset , pravděpodobně budete potřebovat posun časového pásma. A existuje velká možnost, že chcete, aby bylo nastaveno na něco jiného než +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í datum a čas hodnotu na datetimeoffset hodnota. Tato funkce přijímá hodnotu data/času (kterou lze převést na datetime2 hodnotu) a hodnotu offsetu.

Zde je příklad:

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

Výsledek:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +07:00 |
+-------------------------+------------------------------------+

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

DECLARE @thedatetime datetime = '2025-05-21 10:15:30.125';
SELECT 
  @thedatetime AS 'datetime',
  TODATETIMEOFFSET(@thedatetime, '+07:00') AS 'datetimeoffset';

Výsledek:

+-------------------------+------------------------------------+
| datetime                | datetimeoffset(7)                  |
|-------------------------+------------------------------------|
| 2025-05-21 10:15:30.127 | 2025-05-21 10:15:30.1270000 +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. V tomto případě je to datum a čas argument, takže má stupnici 3 (tj. 3 zlomkové sekundy). To pro vás může, ale nemusí být problém. Pokud ano, vždy jej můžete převést na datetimeoffset nejprve předejte převedenou hodnotu do TODATETIMEOFFSET() .

Příklad:

DECLARE @thedatetime datetime, @thedatetimeoffset datetimeoffset(7);
SET @thedatetime = '2025-05-21 10:15:30.125';
SET @thedatetimeoffset = @thedatetime;
SELECT 
  @thedatetime AS 'datetime',
  @thedatetimeoffset AS 'datetimeoffset',
  TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';

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

datetime       | 2025-05-21 10:15:30.127
datetimeoffset | 2025-05-21 10:15:30.1266667 +00:00
Modified       | 2025-05-21 10:15:30.1266667 +07:00

  1. PostgreSQL server se nevypne na Lion (Mac OS 10.7)

  2. Možnosti formátování SQLcl (Oracle)

  3. Jak převést řetězec na datum/čas na serveru SQL pomocí PARSE()

  4. Jak získat měsíc z data v MySQL