МЕЖДУ работает на фактические даты:
SELECT *
FROM projects
WHERE CURDATE() between project_start and project_delivery
order by project_id
Если вы хотите все от месяца (детализация месяца), а не от дня:
SELECT *
FROM projects
WHERE CURDATE() between DATE_SUB(project_start, INTERVAL DAY(project_start)-1 DAY) and
DATE_ADD(DATE_SUB(project_delivery, INTERVAL DAY(project_delivery) DAY), INTERVAL 1 MONTH)
order by project_id
Таким образом, если бы проект начался 5 декабря и закончился 19 января, это дало бы все в период с 1 декабря по 31 января. Имейте в виду, однако, что если какая-либо дата 31 января также имеет компонент времени (то есть позже полуночи), это будет означать, что она немного позже этой даты окончания и не будет отображаться.
Прокомментируйте, если это так, и вам нужна помощь в решении проблемы (проще всего не использовать BETWEEN
, потому что он всегда включительно на каждом конце, используйте <
, который является эксклюзивным)
Обновление: проекты, которые имели некоторую активность в этом месяце, то есть проект, который:
- начался раньше, закончился во время
- началось раньше, закончилось после
- начался во время, закончился во время
- начался во время, закончился после
Общим для всех является то, что дата начала проекта - до конца этого месяца, а также дата окончания проекта - после первого месяца этого месяца
SELECT *
FROM projects
WHERE
--started before the end of this month
project_start < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) - 1 DAY), INTERVAL 1 MONTH) AND
--ended after the start of this month
project_delivery > DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) DAY)
order by project_id
Выполнение DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) DAY)
- довольно запутанный способ написания «вычесть номер текущего дня из текущей даты», т.е. 2019-01-02 minus 2 -> 2018-12-31
. Мы ищем даты >
это (чтобы не включать его)
Аналогичным образом, DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) - 1 DAY), INTERVAL 1 MONTH)
Снимает текущую дату, подпрограммы DAY-1 (т.е. только 1 на этот раз, а не 2), чтобы достичь 1-го числа этого месяца, а затем добавляет месяц, чтобы перейти к первому из следующего месяца. 2019-01-02 -> 2019-01-01 -> 2019-02-01
. Опять <
это так эксклюзивно
Существует ошибка при переходе в другую сторону (добавьте месяц, а затем добавьте день), если вы, например, 31 января, и сначала добавляете месяц - 31 февраля не будет, поэтому mysql завершит свою работу 28 числа фев, затем саб 31 дней выходных, давая дату, которая не является концом января (то есть 28 января)