1

有没有办法用mysql获取过去一周的所有日期,即使它们不包含任何记录?

现在我有一个看起来像这样的查询(对于可以监控工作时间等的应用程序):

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

这真的很好用,但我“只”得到用户实际打卡的日期(这真的是重要的日子)。但是,如果有一种方法可以在一周的时间间隔内获取所有日期,那将是非常棒的。如果是这样的:

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

您可以只使用静态 UNION 7 天,然后将其余部分留给他们

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. 时间表中的所有过滤器大部分都在ON部分中,或者您希望看到没有时间表数据的行。
  2. mysql 自动使用字段,GROUP BYORDER 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 回答