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

时间:2010-06-23 10:07:08

标签: c# 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的建议,但它给出了几乎相同的结果(不同的一小部分)

2 个答案:

答案 0 :(得分:5)

不要使用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分钟的问题上发挥作用。多年来它可能会弥补闰秒,或类似的东西。

答案 1 :(得分:2)

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

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