MySQL дата между периодом - PullRequest
2 голосов
/ 30 ноября 2011

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

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)

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

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

Ответы [ 2 ]

0 голосов
/ 30 ноября 2011
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 
      )
0 голосов
/ 30 ноября 2011

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

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

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

...