2

特定の月 (ユーザー入力に基づく) のデータを MySQL テーブルからエクスポートしたいのですが、その月の各日の created_at の差を計算したくありません。

出席者ID:

  • 1 = 到着
  • 2 = 終了
  • 10 = 在宅勤務

ユーザーが仕事に就いたときの入口は 1 (到着) として記録され、退社したときは 2 (到着) として記録されます。ユーザーは、10 (在宅勤務) としてログに記録された作業を開始し、2 (退出) としてログに記録されたのを停止するときに、自宅で作業することもできます。表 user_attendance

+-----+---------+---------------+----------------+----------------+
| id  | user_id | attendance_id |   created_at   |   updated_at   |
+-----+---------+---------------+----------------+----------------+
|  52 |      45 |             1 | 1.4.2015 6:48  | 1.4.2015 6:48  |
|  53 |      31 |             1 | 1.4.2015 6:52  | 1.4.2015 6:52  |
| 132 |      45 |             2 | 1.4.2015 13:58 | 1.4.2015 13:58 |
| 133 |      31 |             2 | 1.4.2015 14:32 | 1.4.2015 14:32 |
| 159 |      45 |             1 | 2.4.2015 6:49  | 2.4.2015 6:49  |
| 160 |      31 |             1 | 2.4.2015 6:52  | 2.4.2015 6:52  |
| 232 |      31 |             2 | 2.4.2015 15:06 | 2.4.2015 15:06 |
| 233 |      45 |             2 | 2.4.2015 15:09 | 2.4.2015 15:09 |
| 252 |      74 |            10 | 3.4.2015 6:52  | 3.4.2015 6:52  |
| 253 |      74 |             2 | 3.4.2015 15:52 | 3.4.2015 15:52 |
+-----+---------+---------------+----------------+----------------+

SQL:

CREATE TABLE IF NOT EXISTS `user_attendance` (
`id` int(11) NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `attendance_id` int(10) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2836 ;

私の試み:

SELECT A.user_id, A.created_at,HOUR(TIMEDIFF(B.created_at,A.created_at)) AS timedifference
FROM user_attendance A CROSS JOIN user_attendance B
WHERE B.id IN (SELECT MIN(C.id) FROM user_attendance C WHERE C.id > A.id) and A.user_id=45 and A.attendance_id in(1,2) and MONTH(A.created_at)=5
ORDER BY date(A.created_at) ASC

ご覧のとおり、特定のユーザーと 2 つのタイプ (到着と終了) に限定しましたが、時差が 0 であるため、結果は問題ありません。

4

2 に答える 2

0

エラーが除外され、操作の順序が常に1〜2であり、同じ日に出入りする場合、私の解決策は次のとおりです。

SELECT A.user_id, A.created_at,HOUR(TIMEDIFF(B.created_at,A.created_at))
FROM user_attendance A,  user_attendance B
WHERE
    A.attendance_id in (1,10) AND
    B.attendance_id=2 AND
    A.user_id=45 AND
    B.user_id=A.user_id AND
    DAY(A.created_at)=DAY(B.created_at) AND
    MONTH(A.created_at)=5
ORDER BY date(A.created_at) ASC
于 2015-05-24T09:50:48.493 に答える