sql-server-2005nhibernatedatetimetimespan

Convert .NET Ticks to SQL Server DateTime


I am saving a TimeSpan (from .NET) value in my db as BIGINT in SQL Server (saving the Ticks property). I want to know how to convert this BIGINT value to a DATETIME value in SQL Server (not in .NET). Any ideas?

Cheers

EDIT:

I am using NHibernate to map a TimeSpan property I have, and it persists the Ticks property. I use it for relative hours (or minutes) control over some date.

Internally in the system everything is fine, this conversion isn't needed. However, when performing random queries in SQL Server, it is hard to understand the persisted form of a TimeSpan. So, a function where I pass the Ticks value and a DateTime is returned would give the amount in hours, minutes and seconds that that TimeSpan represents.


Solution

  • I'm not sure how accurate this will be with the seconds, but you could try something like:

    Declare @TickValue bigint
    Declare @Days float
    
    Set @TickValue = 634024345696365272 
    Select @Days = @TickValue * POWER(10.00000000000,-7) / 60 / 60 / 24
    
    Select DATEADD(d, Cast(@Days As int), Cast('0001-01-01' As DATE)) 
        + Cast( (@Days - FLOOR(@Days)) As DateTime)
    

    Actually another way that would work in SQL 2005 is to note that the the number of ticks from 0001-01-01 to 1900-01-01 is 599266080000000000. With that you could do:

    Declare @TickOf19000101 bigint
    Declare @TickValue bigint
    Declare @Minutes float
    
    Set @TickOf19000101  = 599266080000000000
    Set @TickValue = DATEDIFF(mi, 0 ,CURRENT_TIMESTAMP) * Cast(60 As BigInt) 
                       * POWER(10.00000000000,7) + @TickOf19000101
    
    Select @TickValue
    Select @Minutes = (@TickValue - @TickOf19000101) * POWER(10.00000000000,-7) / 60
    
    Select @Minutes
    Select DATEADD(MI, @Minutes, '1900-01-01')