2012-07-20 34 views
1

有没有办法得到所有日期从过去一周与MySQL,即使他们不包含任何记录?检索上周在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的,但如果有人知道的方式 - 你会让我的一天。

+0

看看这有助于 http://stackoverflow.com/questions/9120648/search-for-available-dates-within-a-given-range-without-calender-table – Madhivanan 2012-07-20 09:18:46

回答

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 BY作为ORDER BY如果你不speify somthin其他
+0

可以工作 - 然而,如果我想突然使用(DATE_SUB(CURDATE(),INTERVAL 1 MONTH))来检索过去的一个月而不是一周?那会是很多工会? =) – Marcus 2012-07-20 09:34:19

+0

我有一个int值从0到100的特殊表,我使用它:''SELECT CURDATE() - INTERVAL'range'.nr DAY当天从'range' WHERE day> CURDATE() - INTERVAL 1个月'' – 2012-07-20 09:41:02

0

由于您的日期时间为一周,你可以将它们转换成一年中的第n个星期进行比较。

WHERE YEARWEEK(checkout_time) = YEARWEEK(DATE_SUB(CURDATE() ,INTERVAL 7 DAY)) 
相关问题