2017-07-27 103 views
1

我有开始和结束日期如下表:使用DATEDIFF()结果在DSum()函数

dataid  TS     EndTS   
1744 7/27/17 1:57:34 PM 7/27/2017 1:57:38 PM  
1743 7/27/17 1:57:31 PM 7/27/2017 1:57:34 PM 
1742 7/27/17 1:57:23 PM 7/27/2017 1:57:31 PM  
1741 7/27/17 1:57:16 PM 7/27/2017 1:57:23 PM 
1740 7/27/17 1:57:04 PM 7/27/2017 1:57:16 PM  
1739 7/27/17 1:56:57 PM 7/27/2017 1:57:04 PM  
1738 7/27/17 1:56:38 PM 7/27/2017 1:56:57 PM 

我想获得的日期/时间间隔(以秒为单位),然后计算运行总。

这是我到目前为止有:

SELECT 
    [dataid] AS [dataid] 
    DateDiff("s", [TS],[EndTS]) AS [durationsec] 
    DSum("[durationsec]","[HX32]","[dataid] <=" & [dataid]) AS [add] 

FROM [HX32]; 

我认为DATEDIFF()funtion可能是导致格式问题。随着"[durationsec]"我得到的所有空的结果,[durationsec]我得到如下结果:

durationsec add 
     4 6896 
     3 5169 
     8 13776 
     7 12047 
     12 20640 
     7 12033 
     19 32642 

我也试过cint(DateDiff("s", [TS],[EndTS]))没有变化。 我也试着将durationsec传递给一个表并运行一个单独的查询。不用找了。 (此外,我宁愿做这一切在一个查询)

下面是结果我想实现:

dataid  TS     EndTS   durationsec add 
1744 7/27/17 1:57:34 PM 7/27/2017 1:57:38 PM 4  60 
1743 7/27/17 1:57:31 PM 7/27/2017 1:57:34 PM 3  56 
1742 7/27/17 1:57:23 PM 7/27/2017 1:57:31 PM 8  53 
1741 7/27/17 1:57:16 PM 7/27/2017 1:57:23 PM 7  45 
1740 7/27/17 1:57:04 PM 7/27/2017 1:57:16 PM 12  38 
1739 7/27/17 1:56:57 PM 7/27/2017 1:57:04 PM 7  26 
1738 7/27/17 1:56:38 PM 7/27/2017 1:56:57 PM 19  19 

谢谢,我是一个初学者。

+0

我通过计算DATEDIFF运行后DSUM在另一个查询解决。看来你不能在同一个查询中将生成的值datediff值传递给dsum,或者在dsum函数内部有一个datefiff函数。 –

+0

我刚刚测试过,它可以在嵌套在DSum中的DateDiff中工作。编辑我的答案以显示完整的SQL。 – June7

回答

1

DSum正在查看[HX32]表或查询来查找名为[durationsec]的字段。它不存在那里。

SELECT 
    [dataid], 
    DateDiff("s",[TS],[EndTS]) AS [durationsec], 
    DSum("DateDiff('s',[TS],[EndTS])","[HX32]","[dataid] <=" & [dataid]) AS [add] 
FROM [HX32];` 

请注意使用撇号来分隔嵌套的DateDiff中的's'参数。

另一种方法是在报表中执行运行总和,因为报表中的文本框具有RunningSum属性。查询中的域集合函数可以在大型数据集中缓慢执行。

+0

你在说什么总是有道理,但是我仍然因为'add'而得到所有的空值。 –

+0

我用你的示例数据创建了表格,查询使用嵌套的DateDiff。编辑答案显示完整的SQL和更多信息。 – June7

1

时间不秒,但整数天,所以你可以尝试:

SELECT 
    [dataid], 
    DateDiff("s", [TS], [EndTS]) AS [durationsec], 
    DSum("[EndTS]-[TS]", "[HX32]", "[dataid] <= " & [dataid] & "") * 86400 AS [add] 
FROM 
    [HX32]; 

也就是说,六月的方法应该正常工作。如果两者都失败了,还有其他事情正在发生。

+0

我试了两个(相同的结果)。也许其他事情正在发生。我做了一个新表,然后从头开始查询以进行测试。感谢您的输入。 –

1
SELECT dataid, 
     startts, 
     endts, 
     DATEDIFF("s", startts,endts) AS durationsec, 
     SUM(DATEDIFF("s", startts,endts)) OVER (ORDER BY endts ROWS UNBOUNDED PRECEDING) AS runningtotal 
    FROM durtab 
ORDER BY 5 DESC; 

结果:

dataid startts endts durationsec runningtotal 
1744 2017-07-27 13:57:34.000 2017-07-27 13:57:38.000 4 60 
1743 2017-07-27 13:57:31.000 2017-07-27 13:57:34.000 3 56 
1742 2017-07-27 13:57:23.000 2017-07-27 13:57:31.000 8 53 
1741 2017-07-27 13:57:16.000 2017-07-27 13:57:23.000 7 45 
1740 2017-07-27 13:57:04.000 2017-07-27 13:57:16.000 12 38 
1739 2017-07-27 13:56:57.000 2017-07-27 13:57:04.000 7 26 
1738 2017-07-27 13:56:38.000 2017-07-27 13:56:57.000 19 19 
+0

这是否工作在MS访问? (我正在使用2010),它在OVER()func –

+1

处给我一个语法(缺少操作符)错误。Access无法识别所有SQL函数或操作。 – June7