Search This Blog

Saturday, August 18, 2012

Convert .NET DateTime.Ticks to SQL datetime

SQL Server > Convert .NET DateTime.Ticks to SQL datetime

A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.

The value of this property represents the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001, which represents DateTime.MinValue. It does not include the number of ticks that are attributable to leap seconds.





C#

var t = DateTime.Now.ToUniversalTime().Ticks; // ToUniversalTime : Converts the value of the current DateTime object to Coordinated Universal Time (UTC).

SQL Server Function to convert


create function TicksToDateTime
(@Ticks bigint)
RETURNS datetime AS
BEGIN
        -- First, we will convert the ticks into a datetime value with UTC time
         DECLARE @BaseDate datetime;
         SET @BaseDate = '01/01/1900';
         DECLARE @NetFxTicksFromBaseDate bigint;
         SET @NetFxTicksFromBaseDate = @Ticks - 599266080000000000;
-- The numeric constant is the number of .Net Ticks between the System.DateTime.MinValue (01/01/0001) and the SQL Server datetime base date (01/01/1900)
         DECLARE @DaysFromBaseDate int;
         SET @DaysFromBaseDate = @NetFxTicksFromBaseDate / 864000000000; -- The numeric constant is the number of .Net Ticks in a single day.
         DECLARE @TimeOfDayInTicks bigint;
         SET @TimeOfDayInTicks = @NetFxTicksFromBaseDate - @DaysFromBaseDate * 864000000000;
        DECLARE @TimeOfDayInMilliseconds int;
        SET @TimeOfDayInMilliseconds = @TimeOfDayInTicks / 10000; -- A Tick equals to 100 nanoseconds which is 0.0001 milliseconds
        DECLARE @UtcDate datetime;
        SET @UtcDate = DATEADD(ms, @TimeOfDayInMilliseconds, DATEADD(d,@DaysFromBaseDate, @BaseDate)); -- The @UtcDate is already useful. If you need the time in UTC, just return this value.
      -- Now, some magic to get the local time
         RETURN @UtcDate + GETDATE() - GETUTCDATE();
END
GO
select dbo.TicksToDateTime(634808765429446556)

result:

2012-08-18 11:49:02.947