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