Sql 计算两个时间记录之间的差异
我发现许多问题与我的问题相似,但并不完全相同,我在这些问题中没有发现任何帮助,所以这里是一个新的问题 预期输出:如果用户相同,则一个时间记录与上一个时间记录之间的差异 样本表:Sql 计算两个时间记录之间的差异,sql,database,ms-access,Sql,Database,Ms Access,我发现许多问题与我的问题相似,但并不完全相同,我在这些问题中没有发现任何帮助,所以这里是一个新的问题 预期输出:如果用户相同,则一个时间记录与上一个时间记录之间的差异 样本表: +-------+--------+-------------------+------+ | RowID | User | Godzina_transakcji| Diff | +-------+--------+-------------------+------+ | 1 | AAA
+-------+--------+-------------------+------+
| 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在另一个问题中的回答得出了类似的结论,但出于某种原因,它给出了[错误]
您可以结合使用DMax和DLookUp,但在大型数据集上可能会遇到性能问题:
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;
DLookUp根据用户和以前的RowId获取以前的时间:
然后使用DateDiff计算差异:
这将为您提供以秒为单位的时间差。这是因为您将时间存储为文本。您必须转换为真实时间才能直接比较: 选择tblTemp2.RowID, tblTemp2.用户, tblTemp2.Godzina_transakcji, NzDmaxGodzina_transakcji,tblTemp2,时间值[Godzina_transakcji]<&[Godzina_transakcji]和用户='&[User]&',00:00-时间值[Godzina_transakcji]作为差异 来自tblTemp2; 要使用ID,请执行以下操作: 选择 tblTemp2.RowID, tblTemp2.用户, tblTemp2.Godzina_transakcji, 选择TimeValueT.Godzina_transakcji 从tblTemp2作为T 其中T.RowID=tblTemp2.RowID+1和T.User=tblTemp2.User-TimeValue[Godzina_transakji]作为差异 从…起 tblTemp2;
Godzina_transakcji的数据类型是什么?请参阅表定义。在所有表中都显示日期/时间,但可能是因为它从txt文件导入时未正确导入。嗯,现在错误已更改。现在是microsoft数据库引擎找不到输入表或查询用户。这是您的表,所以我猜您没有表用户。为什么不使用您正在测试的表呢?。请看编辑后的答案。哦,对不起,一定是太晚了,看不到。。。我已将格式…,hh:nn:ss添加到整个差分计算中,以获得与Godzina_transakcji相同格式的结果。但我想知道,如果用户在记录之间进行更改,是否有方法返回0或null?在WHERE and now中进行了小的修改-切换参数,它完全可以执行它应该执行的操作。谢谢,你是上帝!感谢您的回答,它是零长度字符串,因为您指出的目标是创建能够处理比Excel更大的数据范围的工具,所以任何性能低下的东西我都必须在一开始就放弃。测试它,看看它是如何为您工作的。
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;
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;
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