我们使用 sql server 作为 Quartz.net 的持久化数据存储。我想写一些查询@时间值。具体来说 - Qrtz_Fired_Triggers.Fired_Time、Qrtz_Triggers.Next_fire_time、Prev_fire_time。
在我的一生中,我找不到任何能说明这些数据是什么的东西——滴答、毫秒、微秒、纳秒。我猜到了几件事,但都被证明是错误的。
最好的答案将包括将大整数转换为日期时间的数学运算,甚至可能是我应该找到的页面/文档的链接 - 解释这些字段中数据的含义。
如果您有关于使用 Quartz .Net 库查看此信息的具体说明,那将不胜感激,但是,我确实有两个目标 - 了解存储的日期/时间数据的含义并将其保留在 T-SQL 中。如果我得到一个,我可以弄清楚 T-SQL 或。
最佳答案
在 SQL 方面,您可以使用以下命令将 Quartz.NET BIGINT 时间转换为 UTC 时间的 DateTime:
SELECT CAST(NEXT_FIRE_TIME/864000000000.0 - 693595.0 AS DATETIME) FROM QRTZ_TRIGGERS
数字说明
列中存储的值是来自 .NET 的刻度数
DateTime.MinValue
UTC 时间。每毫秒有 10000 个滴答声。864000000000.0
表示一天中的滴答数。你可以验证这一点SELECT DATEDIFF(ms,'19000101','19000102')*10000.0
现在,如果我们取 2013 年 3 月 13 日午夜,.NET 返回
634987296000000000
作为刻度数。var ticks = new DateTime(2013, 3, 13).Ticks;
为了得到一个浮点数,其中整数代表天数,十进制数代表时间,我们取刻度并除以每天的刻度数(在我们的例子中给我们
734939.0
)SELECT 634987296000000000/(DATEDIFF(ms,'19000101','19000102')*10000.0)
如果我们将日期放入 SQL 并转换为浮点数,我们会得到一个不同的数字:
41344.0
SELECT CAST(CAST('March 13, 2013 0:00' AS DATETIME) AS FLOAT)
因此,我们需要为 .NET 到 SQL 的日子生成一个转换因子。 SQL 最小日期是 1900 年 1 月 1 日 0:00,因此可以通过获取该时间的滴答数 (
599266080000000000
) 并除以每天的滴答数来计算校正因子,得到 693595.0
SELECT 599266080000000000/(DATEDIFF(ms,'19000101','19000102')*10000.0)
因此,要计算 Quartz.NET 日期的 DateTime:
SELECT CAST([Column]/864000000000.0 - 693595.0 AS DATETIME)
关于tsql - Quartz .Net - BigInt DateTime 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4225705/