1

各エントリに関連付けられた特定の従業員 ID を使用して、1 日を通していくつかのタイム スタンプ エントリが追加されるテーブルがあります。特定の日にその特定の従業員が働いた時間を計算するために、その日の最初のタイムスタンプとその日の最後のタイムスタンプを取得する方法に興味があります。私のテーブルは以下です:

+----+------------+----------+---------+---------------------+-----------+------------+-----------+---------+
| id | employeeID | date     | timeIn  | jobDescription      | equipType | unitNumber | unitHours | timeOut |
+----+------------+----------+---------+---------------------+-----------+------------+-----------+---------+
|  1 |          1 | 01/13/13 | 8:17 pm | Worked in Hubbard   | Dozer     | 2D         |     11931 | 8:17 pm |
|  2 |          1 | 01/13/13 | 8:17 pm | Worked in Jefferson | Excavator | 01E        |      8341 | 8:18 pm |
+----+------------+----------+---------+---------------------+-----------+------------+-----------+---------+

これまでのところ、時間値を取得するために次のようなクエリがあります。

$stmt = $conn->prepare('SELECT * FROM `timeRecords` WHERE `date`= :dateToday AND `employeeID` = :employeeID ORDER BY employeeID ASC');
    $stmt->execute(array(':employeeID' => $_SESSION['employeeID'], ':dateToday' => $dateToday));

timeOutしかし、列の最大値を取得する方法がわかりません

4

1 に答える 1

1

MAX()実際には、集計とMIN()グループ化が必要なだけですemployeeIDTIMEDIFF()関数を使用して、2 つの間の時間差を計算します。

SELECT 
  `employeeID`,
  MIN(`timeIn`) AS `timeIn`,
  MAX(`timeOut`) AS `timeOut`,
  TIMEDIFF(MAX(`timeOut`), MIN(`timeIn`)) AS `totalTime`
FROM `timeRecords`
WHERE
  `date` = :dateToday
  AND `employeeID` = :employeeID
/* Selecting only one employeeID you don't actually need the GROUP BY */
GROUP BY `employeeID`

ただし、従業員が 1 日に何度も出勤と退勤を行った場合、合計勤務時間は報告されません。その場合、in/out ペアのそれぞれのSUM()結果が必要になります。TIMEDIFF()

何かのようなもの:

SELECT
  `employeeID`,
  /* Assumes no times overlap across rows */
  SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(`timeOut`, `timeIn`)))) AS `totalTime`
FROM `timeRecords`
WHERE
  `date` = :dateToday
  AND `employeeID` = :employeeID
GROUP BY `employeeID`
于 2013-01-14T02:51:45.057 に答える