【问题标题】:Convert DateTime.Ticks to MySQL DateTime in query在查询中将 DateTime.Ticks 转换为 MySQL DateTime
【发布时间】:2011-03-07 06:03:24
【问题描述】:

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

单个滴答表示一百纳秒或百万分之一秒。一毫秒内有 10,000 个滴答声。

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

如何在查询中将其转换为 DateTime?我已经尝试了很多东西,但无法让它发挥作用。

对于刻度 634128921500016150 我希望得到 mysql datetime '2010-06-23 12:06:50'

我原以为以下应该可行,但它给出了“4009-06-22 12:15:50.001600”。好像到 2001 年 1 天 9 分钟就过去了……如果年份和天数一致,我可以手动修复它,但分钟数似乎有点奇怪。

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

我尝试添加更多零,但它永远不会匹配:|

我也尝试了 Jon Skeet 的建议,但它给出的结果几乎相同(相差几分之一秒)

【问题讨论】:

    标签: c# mysql datetime


    【解决方案1】:

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

    选择 DATEADD(秒, (CAST(([TickField]-631139040000000000) AS FLOAT)/10000000), '2001-01-01 00:00:00' ) 来自 [表]

    之前的代码在精简版中不起作用。花了一段时间才弄清楚,所以我认为值得包括在内。

    我想它也可以在其他 SQL 版本中工作,但尚未对其进行测试。它的优点是可以作为查询的一部分,因此不需要创建任何函数。

    干杯。

    【讨论】:

      【解决方案2】:

      发现自己今天也在做同样的事情。在 Jon 的回答和 cmets 之间,我能够弄清楚,但它是作为一个函数,全部都用一个漂亮的蝴蝶结包裹起来:

      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);
      

      【讨论】:

      • 谢谢。我发现这很有用。但是因为我在寻找更高的精度值,所以我将DATETIME 的两个引用都更改为DATETIME(6)
      【解决方案3】:

      不要使用 SECOND_MICROSECOND 添加,而是尝试通过 MICROSECOND 添加:

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

      编辑:我刚刚弄清楚为什么这些年份如此错误。 MySQL的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 分钟的问题。多年来它可能会弥补闰秒,或类似的东西。

      【讨论】:

      • 谢谢,但结果相同。我已经用更多细节更新了我的帖子。
      • @simendsjo:我进行了编辑 - 您应该使用 0001 而不是 0000。我知道这听起来只会产生 1 年的差异而不是 2000 年,但 也许 0 在 mysql 中意味着什么特别的东西?
      • 非常感谢,就像一个魅力! base_ticks 需要从 2001 年开始,而不是 1001 年。'0000-00-00 00:00:00' 是 mysql 中空白日期的特殊值,很像 DateTime.MinValue
      • 您好,可以在 Hive 中进行吗?谢谢stackoverflow.com/questions/30502264/…
      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2019-07-29
      相关资源
      最近更新 更多