【问题标题】:Calculate difference between two time records计算两个时间记录之间的差异
【发布时间】:2021-03-18 21:30:58
【问题描述】:

我发现了许多与我的问题相似但不完全相同的问题,我在其中发现的任何问题都没有帮助我,所以这里是新问题。

预期输出:如果用户相同,则一个时间记录与前一个记录之间的差异。

示例表:

+-------+--------+-------------------+------+   
| RowID | User   | Godzina_transakcji| Diff |   
+-------+--------+-------------------+------+   
|    1  | AAA    | 14:23:03          |      |   
|    2  | AAA    | 14:23:57          |      |   
|    3  | AAA    | 14:25:03          |      |   
|    4  | BBB    | 03:37:23          |      |   
|    5  | BBB    | 03:39:21          |      |   
|    6  | BBB    | 05:23:11          |      |   
+-------+---------+------------------+------+ 

所以查询应该对第 1 行给出 0,对于第 2 行给出 =14:23:57-14:23:03 等等。

到目前为止,我有类似的东西(基于@Tom Collins 在其他问题中的回答),但由于某种原因,它给出了 [错误]

 SELECT tblTemp2.RowID,
       tblTemp2.User,
       tblTemp2.Godzina_transakcji,
       Nz(Dmax("Godzina_transakcji", "User", "(Godzina_transakcji <" & [Godzina_transakcji] &
                                             ") and (User = '" & [User]
                                                        &"')"), 0) - [Godzina_transakcji]  AS Diff
FROM   tblTemp2; 

我在这方面做错了什么?此外,在另一个步骤中,我将不得不考虑中间经过午夜。

结论:
如果有人会在这里寻找类似的问题,那就是对我有用的代码。谢谢古斯塔夫,你是神!

SELECT 
    tblTemp2.RowID,
    tblTemp2.User,
    tblTemp2.Godzina_transakcji,
    Format((    Select TimeValue(T.Godzina_transakcji) 
                From tblTemp2 As T
    Where tblTemp2.RowID = T.RowID + 1  And tblTemp2.User = T.User ) - TimeValue([Godzina_transakcji]), "hh:nn:ss") As Diff
FROM
   tblTemp2;

【问题讨论】:

  • Godzina_transakcji的数据类型是什么?请参阅表定义。
  • 在所有表格中都是日期/时间,但可能是因为它是从 txt 文件导入的,所以没有正确导入。

标签: sql database ms-access


【解决方案1】:

那是因为您将时间存储为文本。您必须转换为真实时间才能直接比较:

SELECT tblTemp2.RowID,
       tblTemp2.User,
       tblTemp2.Godzina_transakcji,
       Nz(Dmax("Godzina_transakcji", "tblTemp2", "(TimeValue([Godzina_transakcji]) < #" & [Godzina_transakcji] & "#) and (User = '" & [User] & "')"), #00:00#) - TimeValue([Godzina_transakcji])  AS Diff
FROM   tblTemp2; 

要使用 ID:

SELECT 
    tblTemp2.RowID,
    tblTemp2.User,
    tblTemp2.Godzina_transakcji,
    (Select TimeValue(T.Godzina_transakcji) 
    From tblTemp2 As T
    Where T.RowID = tblTemp2.RowID + 1 And T.User = tblTemp2.User) - TimeValue([Godzina_transakcji]) As Diff
FROM
   tblTemp2;

【讨论】:

  • 嗯,现在错误已经改变。现在是“微软数据库引擎找不到输入表或查询“用户”。
  • 这是你的表,所以我猜你没有表用户。为什么不使用您正在测试的表?请查看编辑后的答案。
  • 呃,抱歉,一定太晚了才看到...我已将 Format(..., "hh:nn:ss") 添加到整体差异计算中以获得相同的结果格式为 Godzina_transakcji。但我想知道如果用户在记录之间发生变化,有没有办法返回 0 或 null?
  • 做了一些小的修改——在 WHERE 中切换了参数,现在它确实做到了它应该做的事情。谢谢,你是神!
  • 感谢您的回答,正如您指出的那样,它是零长度字符串 ""
【解决方案2】:

您可以结合使用DMaxDLookUp,尽管在大型数据集上您可能会遇到性能问题:

SELECT RowID, User, Godzina_transakcji,
Nz(DMax("RowId","tblTemp2","User='" & [User] & "' and RowId<" & [RowId]),0) AS Prev_RowID,
DLookUp("Godzina_transakcji","tblTemp2","User='" & [User] & "' AND RowId=" & [Prev_RowId]) AS Prev_Godzina_transakcji, 
DateDiff("s",[Prev_Godzina_transakcji],[Godzina_transakcji]) AS Diff_in_sec
FROM tblTemp2;

我在查找中使用了RowId 而不是时间,并假设您的数据按时间排序。

DMax 基于User 获取前一个RowId

Nz(DMax("RowId","tblTemp2","User='" & [User] & "' and RowId<" & [RowId]),0) AS Prev_RowID

DLookUp根据用户和上一个RowId获取上一次时间:

DLookUp("Godzina_transakcji","tblTemp2","User='" & [User] & "' AND RowId=" & [Prev_RowId]) AS Prev_Godzina_transakcji

然后您使用DateDiff 计算差异:

DateDiff("s",[Prev_Godzina_transakcji],[Godzina_transakcji]) AS Diff_in_sec

这将为您提供以秒为单位的时差。

【讨论】:

  • 目标是创建能够处理比 Excel 更大的数据范围的工具,因此我必须在开始时丢弃任何性能低下的东西。
猜你喜欢
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2011-08-01
相关资源
最近更新 更多