回答问题

我在 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 的建议,但它给出了几乎相同的结果(几分之一秒不同)

Answers

与其使用 SECOND_MICROSECOND 添加,不如尝试通过 MICROSECOND 添加:

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

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

Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐