tsql - Quartz .Net - BigInt DateTime 的含义

标签 tsql quartz.net

我们使用 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/

    相关文章:

    c# - 如何将参数发送到 Quartz.Net 中的类

    asp.net-mvc-4 - Quartz.NET 触发器不触发,MVC4

    linux - Linux 上的 .Net Core 控制台应用程序不会作为服务运行

    sql-server - 为什么 count(1/null) 有效但 count(null/null) 无效?

    c# - 如何在关闭前检查所有作业是否运行完毕? - quartz 网

    c# - quartz 调度器 : How to pass custom objects as JobParameter?

    c# - 如何将数组传递给 SQL Server 存储过程

    tsql - 如果已经存在,IF Exists 似乎不适用于 Table Drop

    c# - 我必须加入两个复杂的查询才能得到一个结果集

    具有空主体的 SQL Server 存储过程