1

レコードが含まれていない場合でも、mysql を使用して過去 1 週間のすべての日付を取得する方法はありますか?

これで、次のようなクエリが作成されました (作業時間などを監視できるアプリの場合)。

SELECT user_id, SUM( TIME_TO_SEC( checkout_time ) - TIME_TO_SEC( checkin_time ) ) AS total_time, DATE( checkout_time ) AS checkout_day
FROM timetable
WHERE task_id = 19
AND checkout_time >= ( DATE_SUB( CURDATE( ) , INTERVAL 1 WEEK ) )
GROUP BY checkout_day, user_id
ORDER BY checkout_day ASC

これは非常にうまく機能しますが、ユーザーが実際に出勤した日付のみを取得します (これは実際に重要な日です)。しかし、その 1 週間の間隔ですべての日付を取得する方法があれば、本当に素晴らしいことです。次のような場合:

DATE(INTERVAL 1 WEEK) as dates

次を取得します。

|dates
------------
|2012-07-15
|2012-07-16
|2012-07-17
|2012-07-18
|2012-07-19
|2012-07-20

通常 SQL を使用する目的ではないかもしれませんが、誰かが方法を知っているなら、あなたは私の一日を作るでしょう.

4

2 に答える 2

1

7 日間は静的な UNION を使用し、残りは jon に任せることができます。

SELECT
  user_id,
  COALESCE(SUM( TIME_TO_SEC( checkout_time ) - TIME_TO_SEC( checkin_time ) ), 0) AS total_time,
  week.day AS checkout_day
FROM (
   SELECT CURDATE() AS day
   UNION SELECT CURDATE() - INTERVAL 1 DAY
   UNION SELECT CURDATE() - INTERVAL 2 DAY
   UNION SELECT CURDATE() - INTERVAL 3 DAY
   UNION SELECT CURDATE() - INTERVAL 4 DAY
   UNION SELECT CURDATE() - INTERVAL 5 DAY
   UNION SELECT CURDATE() - INTERVAL 6 DAY
) AS week
LEFT JOIN timetable ON (task_id = 19 AND DATE(week.checkout_time) = week.day)
GROUP BY week.day, user_id

ノート

  1. timetable のすべてのフィルターがほとんどの場合ON、または timetable データのない行を表示する必要があります。
  2. mysql は、他のものを指定しないかのGROUP BYようにフィールドを自動的に使用します。ORDER BY
于 2012-07-20T09:27:26.110 に答える
0

日付期間は週なので、それらを年の n 番目の週に変換して比較できます。

WHERE YEARWEEK(checkout_time) = YEARWEEK(DATE_SUB( CURDATE() ,INTERVAL 7 DAY))
于 2012-07-20T09:32:55.760 に答える