sql - 访问 2013 查询,来自连续行时间戳的 DateDiff
问题描述
我遇到了一个问题,成功地完成(运行)在 Access 2013 中的单个表上的查询,使用 SQL 在时间戳的连续/顺序行上完成 Datediff,该时间戳跟踪通过我们的票务系统的票证的状态变化。
标题为:dbo_Master3_FieldHistory 的表有一个字段,用于跟踪每次工单状态更改时的时间戳。不幸的是,它每次更改仅包含 1 个时间戳,这意味着它本质上没有用于再次更改状态时的辅助时间戳,我需要根据 Status 运行 DateDiff 来计算票证的 AGE。
我在 StackOverflow 上找到了一个合理的解决方案,链接如下。当我尝试实施此解决方案时,与细微调整一样,包括过滤旧数据和特定字段的调整,它只会冻结我的 Access 程序并且永远不会超时(必须强制关闭 Access)
'这是基本代码,从链接的 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;
当我尝试运行这些查询时,访问冻结。我尝试了几种方法,但无法使其正常工作
解决方案
我能够弄清楚,感谢那些花时间阅读这个有趣挑战的人。我没有使用提供的链接中的第二个代码集,而是使用了第一个,并且效果很好。通过添加一些代码以考虑其他过滤器/标准,我得到了我需要的结果。
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;
真诚的,克里斯托弗
推荐阅读
- google-apps-script - 只在一张纸上使用脚本
- javascript - 放大/缩小时自动滚动到底部不起作用(Javascript)
- node.js - Google App Engine 服务器未添加 CORS 标头
- junit - 使用 GitLab CI 在 GitLab 中查看 JUnit 报告
- google-cloud-platform - 这是否可以使用非托管实例组在两个不同的端口中创建 GCP 负载均衡器使用相同的实例
- python-3.x - Flask:获取从 Postman 发送的 gzip 文件名
- javascript - 正则表达式获取大括号之间的文本
- flask - Flask wtforms AttributeError:“HTMLString”对象没有属性“分页”
- c++ - 如何使用 TCP 窗口缩放来增加 C++ 中 AWS S3 的吞吐量?
- dynamically-generated - 如何刷新制表符js中的rownum?