【问题标题】:Access 2013 Query, DateDiff from Consecutive Rows TimeStamps访问 2013 查询,来自连续行时间戳的 DateDiff
【发布时间】: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


    【解决方案1】:

    我能够弄清楚,感谢那些花时间阅读这个有趣挑战的人。我没有使用提供的链接中的第二个代码集,而是使用了第一个,并且效果很好。通过添加一些代码以考虑其他过滤器/标准,我得到了我需要的结果。

    
    SELECT T1.mrID, T1.mrSEQUENCE, T1.mrUSERID, T1.mrFIELDNAME, T1.mrNEWFIELDVALUE, T1.mrOLDFIELDVALUE, T1.mrTIMESTAMP, MIN(T2.mrTIMESTAMP) AS mrNextTIMESTAMP, DATEDIFF("s", T1.mrTIMESTAMP, MIN(T2.mrTIMESTAMP)) AS TimeInStatus
    FROM ((dbo_MASTER3_FIELDHISTORY AS T1 LEFT JOIN dbo_MASTER3_FIELDHISTORY AS T2 ON (T2.mrTIMESTAMP > T1.mrTIMESTAMP) AND (T1.mrID = T2.mrID)) INNER JOIN dbo_MASTER3 AS T4 ON (T4.mrID = T1.mrID))
    WHERE T4.mrSUBMITDATE >= #1/1/2018#
    AND t1.mrFIELDNAME = "mrSTATUS"
    AND NOT T4.mrSTATUS="_Deleted_"
    AND NOT T4.mrSTATUS="_SOLVED_"
    AND NOT T4.mrSTATUS="_PENDING_SOLUTION_"
    GROUP BY T1.mrID, T1.mrSEQUENCE, T1.mrUSERID, T1.mrFIELDNAME, T1.mrNEWFIELDVALUE, T1.mrOLDFIELDVALUE, T1.mrTIMESTAMP
    ORDER BY T1.mrID, T1.mrTIMESTAMP;
    

    真诚地, 克里斯托弗

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      相关资源
      最近更新 更多