2010-06-23 87 views
3

我在MySql中有一个存储DateTime.Ticks的整数列。在查询中将DateTime.Ticks转换为MySQL日期时间

单个刻度代表一百纳秒或百万分之一秒。毫秒中有10,000个刻度。

此属性的值表示1月1日,0001

因为12:00:00午夜之后所经过的100纳秒为间隔的数量,我怎样才能将它转换为一个DateTime的查询?我已经尝试了很多东西,但无法让它起作用。

对于蜱634128921500016150我希望能得到MySQL的日期时间“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); 

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

我也试过乔恩斯基特的建议,但它几乎给出了相同的结果(第二个不同的某些部分)

回答

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

+0

谢谢,但它给出了相同的结果。我已经用更多的细节更新了我的帖子。 – simendsjo 2010-06-23 10:23:20

+0

@simendsjo:我做了一个编辑 - 你应该使用0001而不是0000.我知道这听起来像它只会使1年的差异,而不是2000年,但*也许* 0意味着什么特殊的MySQL? – 2010-06-23 10:31:52

+0

非常感谢,作品像魅力! base_ticks需要从2001年开始,而不是1001.“0000-00-00 00:00:00”是mysql中空白日期的特殊值,非常类似于DateTime.MinValue – simendsjo 2010-06-23 12:11:12

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); 
相关问题