2

数据库结构:

activities: id, description, date, time, endDate, endTime, userId

所以我们有一个活动,它需要有一个日期,时间,endDate 和 endTime 不是必需的。

问题是,如果我想获得今天的所有活动,我得到:

SELECT A.*, U.*
FROM activities
JOIN users U
ON U.id = A.userId
WHERE DATE(A.date) = DATE(CURDATE())

所以这将死,得到今天的所有活动,但是如果我们得到一个昨天开始的活动,而结束日期是明天,我还必须得到这个活动怎么办?

我们想要下周末将发生的所有活动,所以我们得到了这个查询:

SELECT A.*, U.*
FROM activities
JOIN users U
ON U.id = A.userId
WHERE UNIX_TIMESTAMP(A.DATE) BETWEEN strtotime('previous saturday') 
AND (strtotime('previous monday') - 1)

但是再一次,如果“约会”是在星期五并将在星期二结束,而我得到了周末发生的所有活动,我仍然必须得到那个活动,我该如何解决这个问题?

非常感谢您的帮助!:)

4

2 回答 2

0
SELECT A.*, U.*
FROM activities
  JOIN users U
    ON U.id = A.userId
  CROSS JOIN                                  --- example: test dates
    ( SELECT CURDATE()    AS startDate        --- between today and 
           , CURDATE() + INTERVAL 3 DAY
                          AS endDate          --- 3 days from now
    ) AS Check
WHERE (   A.endDate IS NULL
      AND A.`date` BETWEEN Check.startDate
                       AND Check.EndDate
      )
   OR (   A.`date` <= Check.EndDate
      AND Check.StartDate <= A.endDate 
      )
于 2011-11-30T12:55:48.137 回答
0

假设您没有具有 的记录date > endDate,以下应该适合您:

SELECT 
  a.*,
  a.begin_date activityBeginDate,
  IF(a.end_date IS NULL, a.begin_date, a.end_date) activityEndDate
FROM activity a
WHERE
  begin_date <= '2011-01-07' AND (end_date IS NULL OR end_date >= '2011-01-06')
HAVING
  (activityBeginDate <= '2011-01-06' AND activityEndDate >= '2011-01-06')
  OR
  (activityBeginDate >= '2011-01-07')
ORDER BY activityBeginDate

为简单起见,我删除了与用户表的连接,但您可以毫无问题地添加它。此查询假定您正在查找 2011-01-06 和 2011-01-07 之间“活动”的事件。

所以我们在这里要做的是列出在我们想要的结束日期之前开始的所有事件,或者在我们想要的开始日期之后结束的所有事件。在这种情况下,您将列出将在您希望的结束日期之前结束的事件。如果这是一个问题,您可以使用其他条件过滤它们。

我会进一步尝试改进这个查询,它可能做的过度工作可以简化。

于 2011-11-30T11:36:00.827 回答