在查询中将 DateTime.Ticks 转换为 MySQL DateTime
回答问题 我在 MySql 中有一个整数列,用于存储 DateTime.Ticks。 一个滴答表示一百纳秒或百万分之一秒。一毫秒内有 10,000 个滴答声。 此属性的值表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数 如何在查询中将其转换为 DateTime?我已经尝试了很多东西,但无法让它发挥作用。 对于刻度 634128921500016150 我希
回答问题
我在 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 分钟的问题。多年来,它可能会弥补闰秒,或类似的东西。
更多推荐
所有评论(0)