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

Převést objekt SQL Server DateTime na BIGINT (.Net ticks)

Diskutoval jsem, zda to zveřejnit, protože to závisí na tom, jak jsou data uložena na binární úrovni v SQL Server, a tak je to velmi křehké řešení. Pro cokoli jiného než jednorázovou konverzi bych použil něco jako odpověď, kterou zveřejnil @Solution Evangelist. Přesto to pro vás může být zajímavé z akademického hlediska, takže to stejně zveřejním.

Využití skutečnosti, že přesnost DateTime2 odpovídá době trvání tick v .NET a že obě jsou založeny na počátečních datech 01-01-0001 00:00:00.0000000 , můžete přenést DateTime na DateTime2 a poté jej přetypujte do binary(9) :0x07F06C999F3CB7340B

Informace o datu a čase jsou uloženy v RTL, takže při obrácení získáme 0x0B34B73C9F996CF007 .

První tři bajty ukládají počet dní od 01-01-0001 a dalších 5 bajtů uchovává 100 ns tiků od půlnoci toho dne, takže můžeme vzít počet dní, vynásobit ticks za den a přidat tiky představující čas uplynulý za den.

Provedení následujícího kódu:

set @date = getdate()
set @ticksPerDay = 864000000000

declare @date2 datetime2 = @date

declare @dateBinary binary(9) = cast(reverse(cast(@date2 as binary(9))) as binary(9))
declare @days bigint = cast(substring(@dateBinary, 1, 3) as bigint)
declare @time bigint = cast(substring(@dateBinary, 4, 5) as bigint)

select @date as [DateTime], @date2 as [DateTime2], @days * @ticksPerDay + @time as [Ticks]

vrátí následující výsledky:

DateTime                DateTime2              Ticks
----------------------- ---------------------- --------------------
2011-09-12 07:20:32.587 2011-09-12 07:20:32.58 634514088325870000

Vezmeme vrácený počet tiků a převedeme zpět na datum a čas v .NET:

DateTime dt = new DateTime(634514088325870000);
dt.ToString("yyyy-MM-dd HH:mm:ss.fffffff").Dump();

Vrátí nám datum ze serveru SQL:

2011-09-12 07:20:32.5870000



  1. Je možné použít MySql uživatelem definovanou proměnnou v .NET MySqlCommand?

  2. Jednoduchý příkaz Postgresql - název sloupce neexistuje

  3. Jak Sind() funguje v PostgreSQL

  4. Zkontrolujte, zda v poli Postgres existuje hodnota