代码之家  ›  专栏  ›  技术社区  ›  Pedro

将.NET标记转换为SQL Server日期时间

  •  12
  • Pedro  · 技术社区  · 14 年前

    我在救一个 TimeSpan (来自.net)在我的数据库中的值 BIGINT 在SQL Server中(保存ticks属性)。我想知道如何转换这个 小精灵 对A的价值 DATETIME SQL Server中的值(不在.NET中)。有什么想法吗?

    干杯

    编辑:

    我在用nhibernate绘制 时限 属性,它将保持ticks属性。我用它来控制某个日期的相对小时(或分钟)。

    在系统内部,一切正常,不需要转换。但是,在SQL Server中执行随机查询时,很难理解 时限 . 所以,我传递 Ticks 价值与A DateTime 返回的值将以小时、分钟和秒为单位给出 时限 代表。

    7 回复  |  直到 9 年前
        1
  •  18
  •   SteveC    13 年前

    我不确定秒数的准确度,但你可以尝试以下方法:

    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)
    

    实际上,在sql 2005中工作的另一种方式是注意到从0001-01-01到1900-01-01的滴答数是5992660800000000。你可以这样做:

    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')
    
        2
  •  12
  •   fogbank    9 年前

    我不太了解sql server,但今天我的一个同事遇到了同样的问题,我 认为 我找到了这样的解决方案:

    CAST(([ticks] - 599266080000000000) / 10000000 / 24 / 60 / 60 AS datetime)
    

    其中59926608000000000是01/01/1900 00:00:00的ticks值。

        3
  •  8
  •   Pavel Chuchuva grapeot    12 年前

    您可以使用从 Pavel Gatilov's blog 要在服务器本地时间中将64位整数转换为精度为毫秒的datetime值,请执行以下操作:

    CREATE FUNCTION NetFxUtcTicksToDateTime
    (
       @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
    

    适合内联使用的替代代码:

    DECLARE @Ticks bigint
    set @Ticks = 634899090000000000
    select DATEADD(ms, ((@Ticks - 599266080000000000) - 
       FLOOR((@Ticks - 599266080000000000) / 864000000000) * 864000000000) / 10000,
       DATEADD(d, (@Ticks - 599266080000000000) / 864000000000, '01/01/1900')) +
       GETDATE() - GETUTCDATE()
    
        4
  •  6
  •   SteveC    13 年前

    TimeSpan 不是日期,因此保存它可能会在将来引起混乱。

    有什么原因不能简单地将记号保存到整数字段而不更改其含义吗?

        5
  •  3
  •   SteveC    13 年前

    获取的值 TimeSpan.TicksPerSecond 在.net中(只需写下来)。

    然后,在您的sql中,您可以将tick计数除以该数字,以给出秒数。

    你可以把这个除以60得到分钟,等等。

        6
  •  2
  •   Jeremy    14 年前

    你应该能够使用 CAST 内置在SQL Server中的函数。

    SELECT(CAST(CAST(CAST ('02/02/10' AS datetime) AS BIGINT) AS datetime)) 
    

    你得到2010-02-02 00:00:00.000

        7
  •  1
  •   SteveC    13 年前

    我自己想出来了:

    2880000000滴答声代表8小时,因此 SELECT 返回指定了小时数的虚拟日期…

    SELECT DATEADD(millisecond, 288000000000/10000, CAST('1900-01-01' AS DATETIME))
    

    感谢大家的努力。