【问题标题】:SQL Query to Extract Timestamp Difference提取时间戳差异的 SQL 查询
【发布时间】:2025-12-10 20:30:01
【问题描述】:

我被委派了一个数据集的任务,该数据集是从另一个数据源中预先提取的,我目前只有 Access 可用于查询此数据(用于基本数据分析的 Excel 目前小于行限制)。本质上,我有三个相关领域:

FK_ID = 与交易关联的任意数字

CD = 与交易状态相关的代码(假设只有 BEGIN 和 END 是值)

TIMESTAMP = 事务的时间戳

现在是这个数据集的一个简化示例:

FK_ID           CD                 TIMESTAMP
000012          END                2012-01-02-14.27.59.133612
000012          BEGIN              2012-01-02-14.27.57.176631
000015          END                2011-12-12-14.27.59.133612
000015          BEGIN              2011-12-11-14.27.59.133612
000019          END                2011-11-10-14.27.59.133612
000019          BEGIN              2011-11-09-14.27.59.133612
000019          END                2011-11-08-14.27.59.133612
000019          BEGIN              2011-11-07-14.27.59.133612

如您所见,它不是很复杂,问题是我需要计算每个唯一 FK_ID 的 BEGIN 和 END 代码之间的时间戳差异,然后创建一个列来统计差异,这也说明了一些事实FK_ID 有多个与之关联的时间戳 BEGIN/END 对。

现在我已被授权忽略存在多于一对的情况(忽略,我的意思是只计算最初的一对),但这并不可取。

我需要得到这些差异来确定总平均时间,以确定该时间是否大致在我们的目标范围内。

获取每个 FK_ID 对的时间戳差异的最佳查询是什么或您建议的其他自动方式?

我确实了解 SQL 并且足够精通 C#,但时间框架和其他因素正在严重破坏我从逻辑上分解这个问题的能力。

【问题讨论】:

  • 我不知道这是从哪里来的,我只能访问必须导入 Access 的电子表格(我相信这是 Jet Engine)。我无权访问源数据库,并且由于我们的基础架构,无法获得访问权限,并且无法运行查询,除非作为大型机作业。
  • 你能确保同一个 fk_id 的时间戳不会有重叠吗?换句话说,每个 START 后面都是 STOP,而不是另一个 START。
  • ID 对于特定的事务来说是非常原子的。实际上,它们大约有 40 个字符长,应该符合您提到的标准。相同 ID 的时间戳不会重叠。
  • 值得注意的是,如果这不适合查询,那么建议将其作为电子表格处理的最佳方法,因为我最初将数据作为 Excel 文件获得,我只后来移植到 Access 以进行本地查询工作。但在 Excel 中几乎没有空间。
  • 我认为如果没有一些 VBA,Access/Excel 就无法做到这一点。 (并且您可以尝试使用超级用户 stackexchange 站点)如果您可以将其带入 SQL Server(sqlexpress 很好)或其他一些功能强大的 RDBMS,您可以对行进行编号并轻松丢弃每个 fk 超过一对的任何行,如果不能准确地将它们配对并考虑所有间隔。但我不确定您是否可以从另一个时间戳中减去一个时间戳以获得一个间隔(或者这将导入具有时间戳数据类型的 sql 服务器)有人对此有预测/承诺吗?

标签: sql ms-access timestamp


【解决方案1】:

假设表名是 TABLE1,在 Access 中我会这样做:

SELECT Table1.FK_ID, DateDiff("s",[TABLE1].[TIMESTAMP],[END_QUERY].[TIMESTAMP]) AS DifferenceInSeconds
FROM Table1 

INNER JOIN 

(SELECT Table1.FK_ID, Table1.CD, Table1.TIMESTAMP
FROM Table1
WHERE (((Table1.CD)="END"))
ORDER BY Table1.FK_ID, Table1.CD) AS END_QUERY 


ON Table1.FK_ID = END_QUERY.FK_ID
WHERE (((Table1.CD)="BEGIN"))
ORDER BY Table1.FK_ID, Table1.CD;

基本上,获取两个子查询的所有 BEGIN 和 END 并获取查询之间的差异(以秒为单位——你没有提到这部分)。您将遇到的一个问题是一个事务有多个条目。您可以使用 GROUP BY 来获得第一个 BEGIN 和最后一个 END,但它们可能存在一些差异。

我希望这对你有一点帮助。

【讨论】:

  • +1 用于发布适用于 JET 的内容,因为它无法加入常量值。