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

在查询中将DateTime.Ticks转换为MySQL DateTime

  •  3
  • simendsjo  · 技术社区  · 14 年前

    MySql中有一个整数列存储DateTime.Ticks。

    一个滴答声代表100纳秒或1千万分之一秒。一毫秒内有一万个滴答声。

    此属性的值表示自0001年1月1日午夜12:00:00以来经过的100纳秒间隔数

    如何将其转换为查询中的日期时间?我试过很多方法,但都不能成功。

    SELECT DATE_ADD('0000-01-01 00:00:00',
      INTERVAL 634128921500016150/10000000 SECOND_MICROSECOND);
    

    我尝试过添加更多的零,但始终不匹配:|

    3 回复  |  直到 4 年前
        1
  •  5
  •   Jon Skeet    14 年前

    不要使用秒添加,而要尝试通过微秒添加:

    SELECT DATE_ADD('0001-01-01 00:00:00',
      INTERVAL 634121049314500000/10 MICROSECOND);
    

    minimum date 是1000年。所以我建议你改成:

    SELECT DATE_ADD('0001-01-01 00:00:00',
      INTERVAL (634121049314500000 - base_ticks)/10 MICROSECOND);
    

    base_ticks new DateTime(1001, 1, 1).Ticks

    见鬼,你可以在任何你想要的地方重新设置基准(例如2000年),这甚至可以解决9分钟的问题。有可能是为了弥补这些年来的闰秒,或者类似的东西。

        2
  •  4
  •   Eric Petroelje    12 年前

    我发现自己今天也在做同样的事情。在乔恩的回答和评论之间,我能够找到答案,但在这里,这是一个函数,所有这些都用一个漂亮的蝴蝶结包裹起来:

    CREATE FUNCTION TicksToDateTime(ticks BIGINT) RETURNS datetime DETERMINISTIC
    RETURN CAST(DATE_ADD('2001-01-01 00:00:00', 
       INTERVAL (ticks - 631139040000000000)/10 MICROSECOND) AS DATETIME);
    
        3
  •  0
  •   Bob M    6 年前

    对于我们这些针对SQL Server Compact Edition进行编码的人,上面的函数在查询中编写为:

    选择DATEADD(second),(CAST(([TickField]-631139040000000000)作为

    前面的代码在紧凑版中不起作用。我花了一段时间才弄明白,所以我认为值得包括在内。

    干杯。