在 SQL 方面,您可以使用以下方法将 Quartz.NET BIGINT 时间转换为 UTC 时间的 DateTime:
SELECT CAST(NEXT_FIRE_TIME/864000000000.0 - 693595.0 AS DATETIME) FROM QRTZ_TRIGGERS
数字解释
该列中存储的值是来自 .NETDateTime.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)