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

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

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

Když převedete datetimeoffset hodnotu na datetime2 , datum a čas se zkopírují do datetime2 a časové pásmo je zkráceno. Zlomkové sekundy jsou také zkráceny, aby se vešly, pokud je přesnost cíle nižší.

datetimeoffset datový typ umožňuje zadat přesnost na zlomky sekund od 0 do 7 pomocí datetimeoffset(n) syntax. Pokud toto nezadáte, použije se 7 (výchozí). Má také posun časového pásma. Velikost úložiště tohoto typu dat je buď 8, 9 nebo 10 bajtů, v závislosti na použité přesnosti.

datetime2 datový typ také umožňuje zadat přesnost na zlomky sekund od 0 do 7 (pomocí datetime2(n) syntax). Nemá povědomí o časovém pásmu. Jeho velikost úložiště je buď 6, 7 nebo 8, v závislosti na použité přesnosti.

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 přidejte 1 bajt k částkám zde uvedeným, abyste získali úplnější obrázek o požadavcích na úložiště.

Příklad 1 – Implicitní konverze

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

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

Výsledek:

+------------------------------------+--------- ---------------------+| datum a čas offset | datetime2 ||------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 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 na datetime2 proměnná.

V tomto příkladu oba datové typy používají výchozí přesnost (7 desetinných míst). Proto zlomková část byla 1234567 pro oba výsledky.

Také vidíme, že byl zkrácen posun časového pásma – datetime2 datový typ nemá povědomí o časovém pásmu.

Při tomto převodu se velikost úložiště zmenšila z 10 bajtů (pro datetimeoffset ) na 8 bajtů (pro datetime2 ), i když si uvědomte, že za účelem uložení přesnosti je přidán 1 bajt.

Příklad 2 – Rozdílná přesnost

Zde je příklad, který ukazuje, co se stane, když datetime2 hodnota používá nižší přesnost než datetimeoffset hodnotu.

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

Výsledek:

+------------------------------------+--------- -----------------+| datum a čas offset | datetime2 ||------------------------------------+---------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.123 |+------------------------------------+- ------------------------+

V tomto příkladu datetimeoffset má stupnici 7 ale datetime2 hodnota má stupnici jen 3 . Proto byly zlomkové sekundy zkráceny, aby se vešly.

Všimněte si, že to může způsobit zaokrouhlování. Zde je příklad, kde zlomková část datetime2 hodnota se zaokrouhlí nahoru na 124 .

DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime2 datetime2(3);SET @thedatetimeoffset ='2025-05-21 10:15:30.1235555 +07:00';SET @thedatetime2 =@thedatetimeoffset;VYBRAT @thedatetimeoffset AS 'datetimeoffset', @thedatetime2 AS 'datetime2';

Výsledek:

+------------------------------------+--------- -----------------+| datum a čas offset | datetime2 ||------------------------------------+---------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.124 |+------------------------------------+- ------------------------+

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

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

Výsledek:

+------------------------------------+--------- ---------------------+| datum a čas offset | datetime2 ||------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 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 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(datetime2, @thedatetimedateoffset) AS;' /před> 

Výsledek:

+------------------------------------+--------- ---------------------+| datum a čas offset | datetime2 ||------------------------------------+---------- -------------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:15:30.1234567 |+-------------------------------------+- ----------------------------+

  1. Jak zkontrolovat, zda soubor existuje v PL/SQL?

  2. Jak spustit a nakonfigurovat ProxySQL 2.0 pro MySQL Galera Cluster na Dockeru

  3. Virtuální sloupce a funkční indexy

  4. Index SQLite