дата mysql между периодом

Структура базы данных:

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)

Но еще раз: что, если «свидание» назначено на пятницу и закончится во вторник, и я получу все мероприятия, которые происходят на выходных, мне все еще нужно получить это мероприятие, как мне решить эту проблему?

Большое спасибо уже за помощь! :)


person user1066101    schedule 30.11.2011    source источник
comment
endDate может быть нулевым, верно? В таком случае вы предполагаете, что событие будет продолжаться вечно?   -  person melihcelik    schedule 30.11.2011
comment
Нет, это продлится только один день   -  person user1066101    schedule 30.11.2011


Ответы (1)


Предполагая, что у вас нет записей с 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

Для простоты я удалил объединение с таблицей пользователей, но вы можете добавить ее без проблем. Этот запрос предполагает, что вы ищете «активные» события между 06 января 2011 г. и 07 января 2011 г.

Итак, что мы здесь делаем, это перечисляем все события, которые начались до желаемой даты окончания ИЛИ которые закончатся после желаемой даты начала. В этом случае вы перечислите события, которые закончатся до желаемой даты окончания. Если это проблема, вы можете отфильтровать их с дополнительными условиями.

В дальнейшем я попытаюсь улучшить этот запрос, возможно, он делает чрезмерную работу, которую можно упростить.

person melihcelik    schedule 30.11.2011
comment
case 'сегодня': $return = ' AND activityBeginDate ‹= DATE(CURDATE()) OR activityEndDate ›= DATE(CURDATE())'; это то, что я получил прямо сейчас, но это не работает (хотя я добавил дополнительные вещи в запрос SELECT;)) - person user1066101; 30.11.2011