2011-05-18 52 views
3

如何查找本周加上以下周日的MySQL数据?查找上周日至下周日的活动

给定一个日期(例如Wednesday 5/18/11),它会显示前一个星期日到下一个星期日的事件。 5/15/115/22/11

诀窍是找到给定日期的“上一个”星期日。

这怎么办?

回答

2
SELECT * 
FROM events 
WHERE Yearweek(`eventdate`) = Yearweek(NOW()) 
     OR (Weekday(NOW()) = 6 
      AND Yearweek(`eventdate`) = Yearweek( 
       DATE_SUB(NOW(), INTERVAL 1 DAY))) 
+0

如果范围应该包含星期日,那么您将需要考虑这一点,以及我相信。 – 2011-05-18 16:44:51

+0

@Tom这就是为什么我在那里有OR子句。 – Pentium10 2011-05-18 20:04:30

+0

我没有方便的mySQL DB,但是只有当NOW()在某一天时,OR才会生效。我不明白在所有情况下这将如何返回8天的范围。如果Weekday(NOW())<> 6,那么您只能获得一个星期的日期。我想你会需要一个关于平日(事件日期)的OR。 – 2011-05-18 20:11:57

0

从奔腾的回答服用,有一些调整...

SELECT 
    * 
FROM 
    Events 
WHERE 
    YEARWEEK(`eventdate`) = YEARWEEK(NOW()) OR 
    (
     WEEKDAY(`eventdate`) = 6 AND 
     YEARWEEK(`eventdate`) = YEARWEEK(NOW()) + 1 
    ) 

这可能需要根据平日的值进行调整(6日?)。

此外,虽然这应该工作,我的猜测是mySQL将无法使用此方法在eventdate列上使用任何索引。最好在边界的周日找到实际的日期,然后做一下BETWEEN或< => =。这应该允许在eventdate上使用索引。即使你现在没有索引,你也许会在将来使用它。

0

使用日历表。 。 。

select cal_date 
from calendar 
where cal_date between 
       (select max(cal_date) from calendar 
        where cal_date <= '2011-05-15' and day_of_week = 'Sun') and 
       (select min(cal_date) from calendar 
        where cal_date > '2011-05-15' and day_of_week = 'Sun') 

如果给定的日期是星期日,你不清楚你想要什么。给定日期为星期日的前一个查询将返回15行。它会在其他日子返回8行。你可以调整WHERE子句中的比较运算符来获得你想要的行为。

我之前在SO上发布了code for a calendar table。它适用于PostgreSQL,但您应该可以在不太麻烦的情况下适应MySQL。

相关问题