使用datediff()导致dsum()函数

时间:2017-07-27 20:46:30

标签: sql ms-access ms-access-2010

我的下表有开始日期和结束日期:

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()函数可能会导致格式化问题。使用"[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

谢谢,我是初学者。

3 个答案:

答案 0 :(得分: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'参数。

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

答案 1 :(得分:1)

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

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

那就是说,六月的方法也应该有效。如果两者都失败了,还会发生其他事情。

答案 2 :(得分: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