如何在没有光标的情况下汇总日期时间?

时间:2018-02-09 19:25:08

标签: sql sql-server sql-server-2012

最佳做法问题。我有DATED, AgentName, Available_Time (DATETIME)的表格。日期不是连续的,例如缺少所有周末,同样AgentName每天都不存在。

我想在给定的日期范围内获得每位用户的SUMAVG。目前,我有一个Cursor,遍历所有可用日期,其中是另一个光标遍历该日期的所有名称。我本来希望使用SUM(COLUMN),但你不能用DATETIME来做COLUMN + COLUMNTIME我尝试转换为CTE,除了一次超过24小时后它回滚到00:00:000我就失去了时间。我在考虑sum,但仍然无法使用if OBJECT_ID('tempdb..#RESULTS') is not null drop table #RESULTS; CREATE TABLE #RESULTS (AgentName NVARCHAR(100) ,DATED DATE ,Available_Time DATETIME ) INSERT INTO #RESULTS VALUES ('007','1/1/2018','1900/01/01 02:33:51') ,('007','1/2/2018','1900/01/01 00:32:37') ,('007','1/3/2018','1900/01/01 01:02:54') ,('007','1/4/2018','1900/01/01 01:22:14') ,('007','1/5/2018','1900/01/01 01:48:42') ,('007','1/7/2018','1900/01/01 01:16:07') ,('007','1/9/2018','1900/01/01 02:25:56') ,('007','1/11/2018','1900/01/01 02:00:09') ,('007','1/13/2018','1900/01/01 12:36:01') ,('007','1/15/2018','1900/01/01 11:56:25') ,('K','1/11/2018','1900/01/01 02:00:09') ,('K','1/13/2018','1900/01/01 12:36:01') ,('K','1/15/2018','1900/01/01 11:56:25') if OBJECT_ID('tempdb..#RESULTS2') is not null drop table #RESULTS2; CREATE TABLE #RESULTS2 (RNUMBER INT ,AgentName NVARCHAR(100) --,DATED DATE ,Available_Time DATETIME ) INSERT INTO #RESULTS2 SELECT ROW_NUMBER() OVER (PARTITION BY AGENTNAME ORDER BY DATED) RNUM ,AgentName --,DATED ,Available_Time from #RESULTS ; WITH DATEAGG AS (SELECT * FROM #RESULTS2 ) SELECT d.AgentName ,d.Available_Time + d2.Available_Time - '1900-01-01 00:00:00.000' FROM DATEAGG d LEFT JOIN DATEAGG d2 on d.AgentName = d2.AgentName and d.RNUMBER = d2.RNUMBER +1 。下面的代码基本上模拟它,但显然给我行不是总和。数据集很小,因此光标不是问题,我只是不喜欢它们:)。想法?

Agent  | Total Time 
007    |  1900/01/02 11:54:23 
K      |  1900/01/01 01:54:23

所以最终输出(这不正确但是)看起来像是:

Agent  | Total Time 
007    |  2D 11:54:23 
K      |  0D 01:54:23

从那里我可以很容易地DATEDIFF(ss,1900/01/01,RESULT)并获得总时间。 最后的答案会是这样的(取决于我的格式)

var someFunction = function() {};

(function() {
  $('.owl-carousel').owlCarousel({
    center: true,
    items: 1,
    loop: true,
    margin: 10,
    nav: true,
    autoplay: true,
    autoplayTimeout: 3000,
    animateOut: 'fadeOut',
    dots: true,
    navText: ["<i class='fa fa-angle-left'></i>", "<i class='fa fa-angle-right'></i>"]
  })
})();



someFunction();

1 个答案:

答案 0 :(得分:1)

DateTime数据类型用于存储时间点,而不是时间量或持续时间。试图将持续时间(或时间量)存储为日期时间会导致您遇到的那种混乱。

时间量是一个数字。将其存储在数据库中的最佳方法是存储一个整数,其中包含您感兴趣的最低细分时间。在你的情况下,它看起来像秒。因此,不应存储包含“1900/01/01 00:01:00”的DateTime,而应存储包含“60”的整数。

然后很容易SUM,AVG或者你想要的任何其他数学运算,当需要在Days,Hours,Minutes和Seconds表达结果时,你可以在查询时进行数学和字符串格式化。 / p>