首页 > 解决方案 > 如何将与 MySQL 中计算工作时间相关的查询转换为 MS Access

问题描述

我想使用 MS Access 计算每天的工作时间。我在 MySQL 中查询了相同的东西,但这个东西在使用 pdo PHP 的 MS Access 中不起作用。

  SELECT MachineNo, Empcardno, Date, SEC_TO_TIME(SUM(tsecs)) AS total_time
FROM (
  SELECT CASE WHEN MachineNo = @mn AND Empcardno = @en AND `Date` = @dt
              THEN @rn := @rn + 1
              ELSE @rn := 1
         END AS rn,
         @mn := MachineNo AS MachineNo, @en := Empcardno AS Empcardno, 
         @dt := `Date` AS `Date`,
         CASE WHEN @rn % 2 = 1 THEN -TIME_TO_SEC(`Time`)
              ELSE TIME_TO_SEC(`Time`)
         END AS tsecs
  FROM timesheet
  CROSS JOIN (SELECT @mn := 0, @en := 0, @dt := '', @rn := 0) init
  ORDER BY Date, Time
) t
GROUP BY MachineNo, Empcardno, Date

如何将此查询转换为与使用 php 的 ms 访问 pdo 连接兼容

标签: mysqlms-access

解决方案


这是一个查询,它将在 Access 上为您提供相同的结果。它使用不同的方法来生成行号,LEFT JOIN在较短的时间使用 self 并计算较短时间的记录数。由于 Access 已经将时间存储为一天的小数部分,因此SUM可以简化,我们FORMAT可以将时间转换为HH:MM:SS格式:

SELECT MachineNo, Empcardno, [Date], 
       FORMAT(SUM(IIF(rn MOD 2 = 0, -TimeValue([Time]), TimeValue([Time]))),'hh:nn:ss') AS total_time
FROM (
  SELECT t1.MachineNo, t1.Empcardno, t1.Date, t1.Time, COUNT(t2.MachineNo) AS rn
  FROM timesheet t1
  LEFT JOIN timesheet t2 ON t2.MachineNo = t1.MachineNo 
                        AND t2.Empcardno = t1.Empcardno
                        AND t2.Date = t1.Date
                        AND TimeValue(t2.Time) < TimeValue(t1.Time)
  GROUP BY t1.MachineNo, t1.Empcardno, t1.Date, t1.Time
)  AS t
GROUP BY MachineNo, Empcardno, Date

输出:

MachineNo   Empcardno   Date        total_time
1           5           21/05/2020  08:19:12
1           5           22/05/2020  08:28:42

推荐阅读