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

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

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

Když převedete datetimeoffset hodnotu na datetime , hodnoty data a času se zkopírují a posun časového pásma se zkrátí. Když je zlomková přesnost datetimeoffset je větší než tři číslice, hodnota je zkrácena.

datetimeoffset datový typ umožňuje zadat přesnost na zlomky sekund od 0 do 7. To se provádí 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. Další bajt se používá k uložení přesnosti, takže se k těmto číslům přidá 1 bajt.

datum a čas datový typ má na druhou stranu maximálně 3 číslice pro svou část ve zlomcích sekund. Jeho přesnost je zaokrouhlena na přírůstky 0,000, 003 nebo 0,007 sekund. Tento typ dat nemá povědomí o časovém pásmu, a proto nemá žádný posun časového pásma. Velikost jeho úložiště je 8 bajtů.

Příklad 1 – Implicitní konverze

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

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

Výsledek:

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

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 datum a čas proměnná.

Vidíme, že datum a čas proměnná má menší přesnost ve zlomcích sekund a my skončíme u zlomkové části 123 i když původní zlomková část byla 1234567 .

V tomto případě nebylo provedeno žádné zaokrouhlení.

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

V tomto převodu se velikost úložiště zmenšila z 10 bajtů (11 bajtů, pokud zahrnete bajt navíc, který ukládá přesnost) pro datetimeoffset , na 8 bajtů pro datum a čas . Pokud však datetimeoffset Pokud by hodnota používala stupnici mezi 0 a 2, použila by pouze 8 bajtů (9 včetně přesnosti).

Pokud by použil stupnici 3 (ekvivalent datetime hodnota), velikost úložiště by byla 9 bajtů (10 s přesností). Jeho přesnost by však byla vyšší než datetime . Jakmile ji převedeme na datum a čas, přesnost by se samozřejmě snížila .

Příklad 2 – Přesnost/přesnost a zaokrouhlování

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 platí také při převodu z jiného datového typu (jako je to, co děláme zde).

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

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

Výsledek:

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

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

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

DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS datetime);<'datetime' /před> 

Výsledek:

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

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(datetime, @thedatetimeoffset); <'datetimeoffset') AS /před> 

Výsledek:

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

  1. Úplné ignorování časových pásem v Rails a PostgreSQL

  2. Problémy s nastavením vlastního primárního klíče při migraci na Rails 4

  3. Top 5 nástrojů pro modelování dat pro SQL Server

  4. 3 způsoby, jak převést desítkové na šestnáctkové v SQL Server (T-SQL)