【问题标题】:MS Access 2010, how to calculate time between two records - identical ID, different timeMS Access 2010,如何计算两条记录之间的时间 - 相同的 ID,不同的时间
【发布时间】:2017-01-08 04:10:08
【问题描述】:

我有一个记录列表,其中包含 AlarmID、System、State 和 Raised ON。

一个事件由两条记录表示,相同的AlarmID,第一个状态为开启,第二个状态为关闭,对应的时间。

这是我的查询:

SELECT *
FROM [Alarmi_On-Off]
WHERE [Alarmi_On-Off].[Alarm ID] IN (SELECT [Alarmi_On-Off].[Alarm ID] 
                                     FROM [Alarmi_On-Off]
                                     GROUP BY [Alarmi_On-Off].[Alarm ID] 
                                     HAVING COUNT([Alarmi_On-Off].[Alarm ID]) > 1);

结果:

+---------+---------+-------+------------------+
| AlarmID | System  | State |    Raised On     |
+---------+---------+-------+------------------+
|    1001 | System1 | On    | 16.08.2016 14:23 |
|    1001 | System1 | Off   | 16.08.2016 16:17 |
|    1002 | System2 | On    | 27.06.2016 12:14 |
|    1002 | System2 | Off   | 27.06.2016 12:24 |
|    1002 | System2 | On    | 14.07.2016 03:37 |
|    1002 | System2 | Off   | 14.07.2016 03:38 |
+---------+---------+-------+------------------+

我想创建一个查询来计算每个系统的开启和关闭状态之间的时间差,记住要排除所有事件少于 2 个的系统(在上面的示例中,排除 AlarmID 1001),我尝试使用“有 COUNT..”

在该查询中,我将有一条记录,而不是两条记录,其中包含系统和计算时间。

感谢任何帮助。

【问题讨论】:

    标签: sql vba ms-access time calc


    【解决方案1】:

    Access 中的语法(可能还有性能)对此将非常糟糕,但这样的东西应该可以工作:

    SELECT AlarmID,System,
        (SELECT TOP 1 [Raised On] FROM [Alarmi_On-Off] 
         WHERE A.AlarmID = AlarmID 
         AND A.[Raised On] < [Raised On] 
         AND State = 'Off' ORDER BY [Raised On]) - [Raised On] AS Duration 
    FROM [Alarmi_On-Off] AS A 
    WHERE State = 'On' 
    ORDER BY AlarmID,[Raised On]
    

    请注意,Duration 值将是一个 Double,代表天数和小数天数。您可以将其转换为 Date 或使用 Access 的日期和时间函数根据需要提取日期和时间部分,即:

    SELECT AlarmID,System,HOUR(Duration) AS Hours, MINUTE(Duration) AS Minutes FROM
    (
    SELECT AlarmID,System,
        (SELECT TOP 1 [Raised On] FROM [Alarmi_On-Off] 
         WHERE A.AlarmID = AlarmID 
         AND A.[Raised On] < [Raised On] 
         AND State = 'Off' ORDER BY [Raised On]) - [Raised On] AS Duration 
    FROM [Alarmi_On-Off] AS A 
    WHERE State = 'On' 
    ORDER BY AlarmID,[Raised On]
    ) T
    

    样本数据的结果:

    AlarmID   System     Hours   Minutes
    1001      System1    1       54
    1002      System2    0       10
    1002      System2    0       1
    

    【讨论】:

      【解决方案2】:

      您可以使用以下查询来查找“On”和“Off”状态之间的时间差:

      SELECT
          start_log.AlarmID,
          start_log.Rasied_On AS start_time,
          end_log.Rasied_On AS end_time,
          DATEDIFF(MINUTE, start_log.Rasied_On, end_log.Rasied_On) AS TimeInMin
      FROM
          [Alarmi_On-Off] AS start_log
      INNER JOIN
          [Alarmi_On-Off] AS end_log ON (
                  start_log.AlarmID = end_log.AlarmID AND start_log.Rasied_On < end_log.Rasied_On)
      WHERE start_log.State = 'On'
      AND end_log.State = 'Off'
      GROUP BY start_log.AlarmID, start_log.Rasied_On, end_log.Rasied_On
      

      输出我的意思是时差以分钟为单位:

      【讨论】:

      • 如果 Access 和 SQL Server 中的每个 AlarmID 有一对以上,我将得到开始和结束时间的笛卡尔积。
      • 非常感谢大家,我下周回到办公室试试。
      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      相关资源
      最近更新 更多