数据库结构:
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())
所以这将是indead,获得今天的所有活动,但是如果我们得到一个昨天开始的活动,结束日期将是明天,我仍然必须参加活动呢?
我们希望下周末发生的所有活动都比我们得到这个查询更多:
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)
但是再一次,如果“约会”在星期五,并将在星期二结束,如果我得到周末发生的所有活动,我仍然必须参加这项活动,我该如何解决呢? / p>
非常感谢您的帮助! :)
答案 0 :(得分: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
为简单起见,我删除了与users表的连接,但您可以毫无问题地添加它。此查询假定您正在查找2011-01-06和2011-01-07之间“活动”的事件。
所以我们在这里做的是列出在我们期望的结束日期之前开始的所有事件,或者在我们期望的开始日期之后结束的所有事件。在这种情况下,您将列出将在所需结束日期之前结束的事件。如果这是一个问题,您可以使用其他条件过滤它们。
我将进一步尝试改进此查询,它可能会过度工作,可以简化。
答案 1 :(得分: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
)