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

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

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

Když převedete smalldatetime hodnotu na datetimeoffset , smalldatetime hodnota se zkopíruje do datetimeoffset hodnota. Zlomkové sekundy jsou nastaveny na 0 a posun časového pásma je nastaven na +00:0.

smalldatetime datový typ nemá žádné zlomkové sekundy a jeho složka sekund je vždy nastavena na nulu (:00). Jeho přesnost je zaokrouhlena na nejbližší minutu.

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ě smalldatetime nemá povědomí o časovém pásmu, takže neexistují žádné existující hodnoty k zachování. V tomto případě je posun časového pásma nastaven na +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. Níže však naleznete mé komentáře a některé příklady týkající se této možnosti.

Příklad 1 – Implicitní konverze

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

DECLARE 
  @thesmalldatetime smalldatetime, 
  @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = @thesmalldatetime;
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset(7)';

Výsledek:

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

Vidíme, že datetimeoffset proměnná má zlomkovou část ( 0000000 ), zatímco smalldatetime hodnota nemá žádnou zlomkovou část a její minuty byly zaokrouhleny nahoru, když k ní byla přiřazena počáteční hodnota. datetimeoffset hodnota také zahrnuje posun časového pásma +00:00 .

Použití přesnosti na 7 zlomků sekund způsobí datetimeoffset použít 11 bajtů pro uložení (10 bajtů pro uložení dat, 1 bajt pro přesnost). Pro srovnání smalldatetime používá pouze 4 bajty. Můžete však snížit přesnost datetimeoffset hodnotu nahrazením 7 nižším číslem. Pokud chcete část se zlomky sekund odstranit úplně, jednoduše použijte datetimeoffset(0) . Tím se zmenší velikost úložiště na 9 bajtů (včetně 1 pro přesnost).

Příklad 2 – 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 datetimeoffset .

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

Výsledek:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

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

Výsledek:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset(7)                  |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +00:00 |
+---------------------+------------------------------------+

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

Skutečnost, že převádíte smalldatetime hodnoty na datetimeoffset znamená, že to pravděpodobně děláte pro posun časového pásma. A je pravděpodobné, že chcete, aby byl nastaven na jiný offset než +00:00 (výchozí offset).

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

Tuto funkci můžete také použít k převodu původního smalldatetime 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 @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset;
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset';

Výsledek:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +07:00 |
+---------------------+------------------------------------+

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

DECLARE @thesmalldatetime smalldatetime = '2025-05-21 10:15:30';
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  TODATETIMEOFFSET(@thesmalldatetime, '+07:00') AS 'datetimeoffset';

Výsledek:

+---------------------+------------------------------------+
| smalldatetime       | datetimeoffset                     |
|---------------------+------------------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00.0000000 +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 smalldatetime argument, který nemá žádné zlomkové sekundy.

Můj systém vrací koncové nuly s datetimeoffset zlomkovou část, ale můžete vidět něco takového:

+---------------------+----------------------------+
| smalldatetime       | datetimeoffset             |
|---------------------+----------------------------|
| 2025-05-21 10:16:00 | 2025-05-21 10:16:00 +07:00 |
+---------------------+----------------------------+

Ať tak či onak, stále můžete plně využít datetimeoffset přesnost datového typu, pokud budete potřebovat hodnotu později upravit.

Zde je příklad, který používá DATEADD() funkce pro změnu zlomků sekund poté, co již byla konverze provedena.

DECLARE @thesmalldatetime smalldatetime, @thedatetimeoffset datetimeoffset(7);
SET @thesmalldatetime = '2025-05-21 10:15:30';
SET @thedatetimeoffset = TODATETIMEOFFSET(@thesmalldatetime, '+07:00');
SELECT 
  @thesmalldatetime AS 'smalldatetime',
  @thedatetimeoffset AS 'datetimeoffset',
  DATEADD(nanosecond, 123456700, @thedatetimeoffset) AS 'Modified';

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

smalldatetime  | 2025-05-21 10:16:00
datetimeoffset | 2025-05-21 10:16:00.0000000 +07:00
Modified       | 2025-05-21 10:16:00.1234567 +07:00

  1. Jak se dotazovat na hodnoty null v poli json typu postgresql?

  2. chyba při vkládání android.database.sqlite.sqliteconstraintexception error code 19 constraint failed

  3. Jaké jsou rozdíly mezi INSERT a UPDATE v MySQL?

  4. Jak zlepšit výkon replikace v clusteru MySQL nebo MariaDB Galera