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