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

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

单个刻度表示一百纳秒或一千万分之一秒。 一毫秒内有10,000个刻度。

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

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

对于ticks 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的建议,但它给出了几乎相同的结果(不同的一小部分)

而不是使用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 base_ticks )的滴答值new DateTime(1001, 1, 1).Ticks

哎呀,你可以在任何你想要的地方(例如2000年)进行改变 – 这甚至可能会在9分钟的问题上发挥作用。 它可能会弥补多年来的闰秒,或类似的东西。

发现自己今天做同样的事情。 在Jon的回答和评论之间,我能够弄清楚,但在这里它是一个function,所有包裹着一个很好的弓:

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

对于我们这些针对SQL Server Compact Edition编码的人来说,上面的bow包裹函数是在查询中编写的:

选择DATEADD(第二,(CAST(([TickField] -631139040000000000)AS FLOAT)/ 10000000),’2001-01-01 00:00:00’)从[表格]

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

我想它也适用于其他SQL版本但尚未测试过。 它具有成为查询一部分的优点,因此不需要创建任何function。

干杯。