【发布时间】:2019-10-10 09:15:21
【问题描述】:
我在使用 SQL 在 Access 2013 中成功完成(运行)单个表上的查询以完成时间戳的连续/顺序行上的 Datediff 时遇到问题,该时间戳跟踪通过我们的票务系统的票证的状态变化。
标题为:dbo_Master3_FieldHistory 的表有一个字段,用于跟踪每次工单状态更改时的时间戳。不幸的是,它每次更改只包含 1 个时间戳,这意味着它本身并没有第二个时间戳用于状态再次更改,我需要运行 DateDiff 来根据状态计算票证的 AGE。
我在 StackOverflow 上找到了一个合理的解决方案,链接如下。当我尝试实施此解决方案时,与细微调整一样,包括过滤旧数据和特定字段的调整,它只会冻结我的 Access 程序并且永远不会超时(必须强制关闭 Access)
Date Difference between consecutive rows
'这是基本代码,从链接的 StackOverflow 解决方案翻译以适合此表字段(我相信)
SELECT T.mrID, T.mrSEQUENCE, T.mrUSERID, T.mrFIELDNAME, T.mrNEWFIELDVALUE, T.mrOLDFIELDVALUE, T.mrTIMESTAMP, T.mrNextTIMESTAMP, DateDiff("s",T.mrTIMESTAMP, T.mrNextTIMESTAMP) AS STATUSTIME
FROM (
SELECT T1.mrID, T1.mrSEQUENCE, T1.mrUSERID, T1.mrFIELDNAME, T1.mrNEWFIELDVALUE, T1.mrOLDFIELDVALUE, T1.mrTIMESTAMP,
(SELECT MIN(mrTIMESTAMP)
FROM dbo_MASTER3_FIELDHISTORY AS T2
WHERE T2.mrID = T1.mrID
AND T2.mrTIMESTAMP > T1.mrTIMESTAMP
) As mrNextTIMESTAMP
FROM dbo_MASTER3_FIELDHISTORY AS T1
) AS T
'这是我想用来过滤掉两个特定字段的代码,将数据限制为 2018 年 1 月 1 日之后的工单 (mrID),并且仅限于 mrFIELDNAME 为 mrSTATUS 的工单
SELECT T.mrID, T.mrSEQUENCE, T.mrUSERID, T.mrFIELDNAME, T.mrNEWFIELDVALUE, T.mrOLDFIELDVALUE, T.mrTIMESTAMP, T.mrNextTIMESTAMP, DateDiff("s",T.mrTIMESTAMP, T.mrNextTIMESTAMP) AS STATUSTIME
FROM (
SELECT T1.mrID, T1.mrSEQUENCE, T1.mrUSERID, T1.mrFIELDNAME, T1.mrNEWFIELDVALUE, T1.mrOLDFIELDVALUE, T1.mrTIMESTAMP,
(SELECT MIN(mrTIMESTAMP)
FROM dbo_MASTER3_FIELDHISTORY AS T2
WHERE mrFIELDNAME = "mrSTATUS"
AND T2.mrID = T1.mrID
AND T2.mrTIMESTAMP > T1.mrTIMESTAMP
) As T1.mrNextTIMESTAMP
FROM dbo_MASTER3_FIELDHISTORY AS T1
WHERE mrFIELDNAME = "mrSTATUS"
AND mrTIMESTAMP >= #1/1/2018#
) AS T;
当我尝试运行这些查询时,访问会冻结。我尝试了几种方法,但无法让它工作
【问题讨论】:
标签: sql ms-access rows datediff sequential