sql >> Database >  >> RDS >> Sqlserver

Converteer SQL Server DateTime-object naar BIGINT (.Net ticks)

Ik heb gedebatteerd of ik dit zou posten omdat het afhangt van hoe datums op binair niveau in SQL Server worden opgeslagen, en het is dus een zeer broze oplossing. Voor iets anders dan een eenmalige conversie zou ik zoiets gebruiken als het antwoord dat @Solution Evangelist plaatste. Toch vind je dit misschien interessant op een academische manier, dus ik zal het toch posten.

Gebruik makend van het feit dat de nauwkeurigheid van DateTime2 overeenkomt met de duur van het vinkje in .NET en dat beide zijn gebaseerd op startdatums van 01-01-0001 00:00:00.0000000 , kunt u de DateTime . casten naar DateTime2 en cast het vervolgens naar binary(9) :0x07F06C999F3CB7340B

De datetime-informatie wordt RTL opgeslagen, dus omkerend, krijgen we 0x0B34B73C9F996CF007 .

De eerste drie bytes slaan het aantal dagen op sinds 01-01-0001 en de volgende 5 bytes slaan de 100ns ticks op sinds middernacht van die dag, dus we kunnen het aantal dagen nemen, vermenigvuldigen met de ticks in een dag en de ticks toevoegen die de verstreken tijd voor de dag vertegenwoordigen.

De volgende code uitvoeren:

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]

geeft de volgende resultaten:

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

Het geretourneerde aantal Ticks nemen en terug converteren naar een DateTime in .NET:

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

Geeft ons de datum terug van de sql-server:

2011-09-12 07:20:32.5870000



  1. Hoe video-inhoud op te slaan in de SQLite-database (niet het videopad)

  2. Mysql - verwijderen uit meerdere tabellen met één query

  3. Maak een SQL Server Agent-schema met T-SQL

  4. Hoe kan ik SQL schrijven voor een tabel die dezelfde naam heeft als een beveiligd sleutelwoord in MySql?