Quartz .Net - BigInt DateTime的含义

Jef*_*ass 12 t-sql quartz.net

我们使用sql server作为Quartz.net的持久数据存储.我想写一些查询@the Time值的查询.具体来说 - Qrtz_Fired_Triggers.Fired_Time,Qrtz_Triggers.Next_fire_time,Prev_fire_time.

对于我的生活,我找不到任何说明这些数据的东西 - 刻度,毫秒,微秒,纳秒.我已经猜到了几件事,但他们都被证明是错的.

最好的答案包括将大型int转换为日期时间的数学,甚至可能是我应该找到的页面/文档的链接 - 解释这些字段中数据的含义.

如果您有关于使用Quartz .Net库查看此信息的具体说明,那么我将非常感激,但是,我确实有2个目标 - 了解存储日期/时间数据的含义并将其保存在T-SQL中.如果我得到了那个,我可以找出T-SQL或者出来.

sal*_*uce 27

在SQL端,您可以使用以下内容将Quartz.NET BIGINT时间转换为UTC时间的DateTime:

SELECT CAST(NEXT_FIRE_TIME/864000000000.0 - 693595.0 AS DATETIME) FROM QRTZ_TRIGGERS
Run Code Online (Sandbox Code Playgroud)

数字解释

存储在列中的值是DateTime.MinValueUTC时间内.NET的刻度数.每毫秒有10000个刻度.

864000000000.0代表蜱的单日数量.你可以用这个验证

SELECT DATEDIFF(ms,'19000101','19000102')*10000.0
Run Code Online (Sandbox Code Playgroud)

现在,如果我们在2013年3月13日午夜时分,则返回.NET 634987296000000000作为滴答数.

var ticks = new DateTime(2013, 3, 13).Ticks;
Run Code Online (Sandbox Code Playgroud)

要获得一个浮点数,其中整数表示天数,十进制数表示时间,我们采用刻度并除以每天的刻度数(734939.0在我们的示例中给出)

SELECT 634987296000000000/(DATEDIFF(ms,'19000101','19000102')*10000.0)
Run Code Online (Sandbox Code Playgroud)

如果我们将日期放在SQL中并转换为float,我们会得到一个不同的数字: 41344.0

SELECT CAST(CAST('March 13, 2013 0:00' AS DATETIME) AS FLOAT)
Run Code Online (Sandbox Code Playgroud)

因此,我们需要为.NET-to-SQL天生成转换因子.SQL最小日期是1900年1月1日0:00,因此可以通过获取该时间599266080000000000的刻度数()并除以每天的刻度来计算修正系数,给出我们693595.0

SELECT 599266080000000000/(DATEDIFF(ms,'19000101','19000102')*10000.0)
Run Code Online (Sandbox Code Playgroud)

因此,要计算Quartz.NET日期的DateTime:

  • 获取列中的值
  • 除以每天的滴答数
  • 减去校正因子
  • 转换为DATETIME
SELECT CAST([Column]/864000000000.0 - 693595.0 AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章很旧,但我只想说这应该是公认的答案。 (2认同)

Mar*_*hma 4

数据库中存储的值是 DateTime.Ticks 值。来自 MSDN:

一个刻度代表一百纳秒或百万分之一秒。一毫秒有 10,000 个刻度。

此属性的值表示自 0001 年 1 月 1 日午夜 12:00:00 以来经过的 100 纳秒间隔数,它表示 DateTime.MinValue。它不包括归因于闰秒的刻度数。