Tsql Quartz.Net-BigInt DateTime的含义

Tsql Quartz.Net-BigInt DateTime的含义,tsql,quartz.net,Tsql,Quartz.net,我们使用sql server作为Quartz.net的持久化数据存储。我想写一些查询,查找时间值。特别是-Qrtz_触发。触发时间,Qrtz_触发。下一次触发时间,上一次触发时间 就我的一生而言,我找不到任何能说明这些数据是什么的东西——滴答声、毫秒、微秒、纳秒。我猜了几件事,但都被证明是错的 最好的答案应该包括将大整数转换成日期时间的数学运算,甚至可能是我应该找到的页面/文档的链接——解释这些字段中数据的含义 如果您有使用Quartz.Net库查看此信息的具体说明,我们将不胜感激,但是,我确实

我们使用sql server作为Quartz.net的持久化数据存储。我想写一些查询,查找时间值。特别是-Qrtz_触发。触发时间,Qrtz_触发。下一次触发时间,上一次触发时间

就我的一生而言,我找不到任何能说明这些数据是什么的东西——滴答声、毫秒、微秒、纳秒。我猜了几件事,但都被证明是错的

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


如果您有使用Quartz.Net库查看此信息的具体说明,我们将不胜感激,但是,我确实有两个目标—理解存储的日期/时间数据的含义,并将其保存在T-SQL中。如果我得到一个,我可以算出T-SQL或out。

存储在数据库中的值是DateTime.Ticks值。从MSDN:

一个勾号代表一百 纳秒或一千万分之一秒 第二一个房间里有10000只蜱 毫秒

此属性的值表示 100纳秒间隔的数目 从12点到现在已经过去了 0001年1月1日午夜,哪天 表示DateTime.MinValue。是的 不包括所需的刻度数 可归因于闰秒


因此,除非我遗漏了什么,并且把它弄得太复杂了,否则我无法让Ms Sql Server 2008中的dateadd函数处理如此大的值,并且我不断地出现溢出错误。我在Ms Sql Server中采用的方法是: a查找比0001.01.01更接近现在的日期及其刻度值 b使用函数给我一个日期时间值

注: *对于我的应用程序,秒就足够了。 *我还没有对此进行过广泛的测试,但到目前为止,它对我来说表现得相当不错

职能:

  CREATE FUNCTION [dbo].[net_ticks_to_date_time]
   (
      @net_ticks BIGINT
   )
   RETURNS DATETIME
   AS
   BEGIN

      DECLARE 
         @dt_2010_11_01 AS DATETIME = '2010-11-01'
      ,  @bi_ticks_for_2010_11_01 AS BIGINT = 634241664000000000
      ,  @bi_ticks_in_a_second AS BIGINT = 10000000

      RETURN
         (
            DATEADD(SECOND , ( ( @net_ticks - @bi_ticks_for_2010_11_01 ) / @bi_ticks_in_a_second ) , @dt_2010_11_01)
         );

   END
  GO
以下是我如何得出最近某个日期的滴答声:
在SQL端,您可以使用以下命令将Quartz.NET BIGINT时间转换为UTC时间的日期时间:

SELECT CAST(NEXT_FIRE_TIME/864000000000.0 - 693595.0 AS DATETIME) FROM QRTZ_TRIGGERS
数字说明 列中存储的值是UTC时间内.NET DateTime.MinValue中的刻度数。每毫秒有10000个滴答声

864000000000.0表示一天中的滴答数。您可以使用

SELECT DATEDIFF(ms,'19000101','19000102')*10000.0
现在,如果我们将2013年3月13日午夜计算,.NET返回63498729600000000作为滴答数

var ticks = new DateTime(2013, 3, 13).Ticks;
为了得到一个浮点数,其中整数表示天,十进制数表示时间,我们取刻度并除以每天的刻度数,在我们的示例中为734939.0

SELECT 634987296000000000/(DATEDIFF(ms,'19000101','19000102')*10000.0)
如果我们将日期放在SQL中并转换为浮点,我们会得到一个不同的数字:41344.0

因此,我们需要为.NET到SQL天数生成一个转换因子。SQL最小日期为1900年1月1日0:00,因此可以通过将该时间的滴答数5992660800000000除以每天的滴答数来计算修正系数,得到693595.0

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

取列中的值 除以每天的滴答声数 减去校正系数 转换为日期时间
问题不是什么是日期时间。滴答声?问题是-在Quartz.net中,当日期/时间存储为大整数时,该数据的含义是什么?其含义取决于上下文。通常是触发器的开始时间、触发器的结束时间或最后一次触发时间。栏目名称应在栏目基础上透露意图。请接受我的道歉。我匆忙回答,设法直接跳到MSDN:。谢谢你花时间回答我的问题。不用担心,很高兴我能帮上忙。或者,为了得到C:new DateTime2010,11,01中日期的刻度。刻度给出了634241664000000000。我尝试了这个,得到了正好两个小时的差异。我想我需要从UTC基准时间加上+2小时的时间偏移。@如果是,如果你是UTC+2,那么你需要在函数结果中加上2小时,以获得本地时区的时间。@saluce在我的测试中使用flaot,计算会导致毫秒差异,可能是舍入错误,例如8:30:00000表示为08:29:59.997。取出浮子部分给出准确的时间!我遗漏了什么?@natenho是的,将SELECT cast'March 13,2013 8:30'作为DATETIME和FLOAT作为DATETIME生成一个微小的舍入误差,0:59.997是SQL Server在1:00.000以下的近似值1毫秒。SQL Server没有记录精确的毫秒,它实际上使用了1/300秒3.33毫秒的精度,因此由于舍入错误而损失了3毫秒。这篇文章很旧,但我只想说这应该是公认的答案。
SELECT 634987296000000000/(DATEDIFF(ms,'19000101','19000102')*10000.0)
SELECT CAST(CAST('March 13, 2013 0:00' AS DATETIME) AS FLOAT)
SELECT 599266080000000000/(DATEDIFF(ms,'19000101','19000102')*10000.0)
SELECT CAST([Column]/864000000000.0 - 693595.0 AS DATETIME)