在查询中将 DateTime.Ticks 转换为 MySQL DateTime
Posted
技术标签:
【中文标题】在查询中将 DateTime.Ticks 转换为 MySQL DateTime【英文标题】:Convert DateTime.Ticks to MySQL DateTime in query 【发布时间】:2011-03-07 06:03:24 【问题描述】: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 的建议,但它给出的结果几乎相同(相差几分之一秒)
【问题讨论】:
【参考方案1】:对于我们这些针对 SQL Server Compact Edition 进行编码的人,上述弓形包装函数在查询中编写为:
选择 DATEADD(秒, (CAST(([TickField]-631139040000000000) AS FLOAT)/10000000), '2001-01-01 00:00:00' ) 来自 [表]
之前的代码在精简版中不起作用。花了一段时间才弄清楚,所以我认为值得包括在内。
我想它也可以在其他 SQL 版本中工作,但尚未对其进行测试。它的优点是可以作为查询的一部分,因此不需要创建任何函数。
干杯。
【讨论】:
【参考方案2】:发现自己今天也在做同样的事情。在 Jon 的回答和 cmets 之间,我能够弄清楚,但它是作为一个函数,全部都用一个漂亮的蝴蝶结包裹起来:
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);
【讨论】:
谢谢。我发现这很有用。但是因为我在寻找更高的精度值,所以我将DATETIME
的两个引用都更改为DATETIME(6)
。【参考方案3】:
不要使用 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 分钟的问题。多年来它可能会弥补闰秒,或类似的东西。
【讨论】:
谢谢,但结果相同。我已经用更多细节更新了我的帖子。 @simendsjo:我进行了编辑 - 您应该使用 0001 而不是 0000。我知道这听起来只会产生 1 年的差异而不是 2000 年,但 也许 0 在 mysql 中意味着什么特别的东西? 非常感谢,就像一个魅力! base_ticks 需要从 2001 年开始,而不是 1001 年。'0000-00-00 00:00:00' 是 mysql 中空白日期的特殊值,很像 DateTime.MinValue 您好,可以在 Hive 中进行吗?谢谢***.com/questions/30502264/…以上是关于在查询中将 DateTime.Ticks 转换为 MySQL DateTime的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 脚本将 DateTime.Ticks 值转换为 SQL Date
如何在 C++ ATL/MFC 中检索具有相同格式的刻度,如 DateTime.Ticks