С помощью дополнительного условия «текущий_месяц BETWEEN месяц_начала AND месяц_окончания». Собственно, для вывода количества событий в календаре этого условия будет достаточно (оно захватит в себя все активные события этого месяца).
Конструкция вида «STR_TO_DATE(DATE_FORMAT(date, 'date_format'), 'date_format')» представляет из себя аналог функции обрезания даты (по аналогии с другими СУБД, например, функции TRUNC() для Oracle).
А для оптимизации работы можно было бы хранить значение текущего месяца в отдельном поле — тогда появилась бы возможность использовать еще и индексы.
SELECT
MONTHNAME(STR_TO_DATE(DATE_FORMAT(d.start_date, '01.%m.%Y'), '%d.%m.%Y')) AS R_MONTH_NAME,
COUNT(*) AS R_COUNT
FROM
dates d
GROUP BY
R_MONTH_NAME
По месяцам с ограничением длительности события на год/месяц/день (оставить одно условие для нужного эффекта):
SELECT
MONTHNAME(STR_TO_DATE(DATE_FORMAT(d.start_date, '01.%m.%Y'), '%d.%m.%Y')) AS R_MONTH_NAME,
COUNT(*) AS R_COUNT
FROM
dates d
WHERE
1 = 1
/* в один год */
/* AND STR_TO_DATE(DATE_FORMAT(d.start_date, '01.01.%Y'), '%d.%m.%Y') = STR_TO_DATE(DATE_FORMAT(d.end_date, '01.01.%Y'), '%d.%m.%Y') */
/* в один месяц */
/* AND STR_TO_DATE(DATE_FORMAT(d.start_date, '01.%m.%Y'), '%d.%m.%Y') = STR_TO_DATE(DATE_FORMAT(d.end_date, '01.%m.%Y'), '%d.%m.%Y') */
/* в один день */
/* AND STR_TO_DATE(DATE_FORMAT(d.start_date, '%d.%m.%Y'), '%d.%m.%Y') = STR_TO_DATE(DATE_FORMAT(d.end_date, '%d.%m.%Y'), '%d.%m.%Y') */
GROUP BY
R_MONTH_NAME
Видимо, вы очень далеко от разработчиков приложений для массового использования. Никто из пользователей ради одной программы не будет качать и устанавливать 200 Мб обновлений.
SVN во всем этом вообще ни причем. Использовав DVCS — сценарий был бы точно таким же. Проблемы были в знаниях и опыте участников проекта, в неправильной организации разработки, но никак не в используемых инструментах.
Впереди еще внедрение непрерывной разработки и автоматической сборки проектов. Удачи с этим. И, надеюсь, вам все-таки удастся просмотреть статьи на тему «10 вещей, которые надо (не надо) делать при работе с...» — а то как-то слижком уж много граблей было у вас на пути.
А если серьезно, то такие «велосипедисты» — очень большая проблема в реальных проектах. Они тратят огромное количество времени и средств заказчика на реализацию того, что уже было написано до них — просто потому, что либо не знают о существовании уже готового решения, либо буквально отвергают чужой код и идеи. Низкое качество продукта, перенос сроков и постоянное переписывание кода с нуля — вот самые болезненные признаки таких людей.
Злоупотребление в том, что здесь классическую задачу по перебору элементов дерева вместо простого решения с использованием рекурсии и цикла решают с помощью таких громозких инструментов, как LINQ и т.п. Все-равно, что стрелять в мух из пушки.
В приведенных решениях мало того, что невозможно разобраться с первого раза (в одном из примеров даже потребовались комментарии!), этот код невозможно легко модифицировать, отлаживать, да и вообще что-либо с ним делать. За такой код, попади он в рабочую ветку, ваши коллеги долго будут вспоминать вас добрым словом.
Почему? У Oracle есть прекрасная бесплатная версия СУБД — Oracle XE, которая хорошо подходит под небольшие проекты. Как только появится необходимость в большой базе — перейти на нее с XE будет не проблема.
Oracle — это не просто база данных, а целая инфраструктура, включающая в себя огромное количество технологий и программных продуктов для корпоративного рынка. СУБД — это лишь малая часть айсберга.
Думаю, фраза «слетели пароли» будет более понятной для простых пользователей банк-клиента (читай, бухгалтеров), чем «возникли проблемы с сервером авторизации, где сгорел массив из жестких дисков и сейчас в срочном порядке происходит восстановление данных из резервной копии».
Конструкция вида «STR_TO_DATE(DATE_FORMAT(date, 'date_format'), 'date_format')» представляет из себя аналог функции обрезания даты (по аналогии с другими СУБД, например, функции TRUNC() для Oracle).
А для оптимизации работы можно было бы хранить значение текущего месяца в отдельном поле — тогда появилась бы возможность использовать еще и индексы.
SELECT
MONTHNAME(STR_TO_DATE(DATE_FORMAT(d.start_date, '01.%m.%Y'), '%d.%m.%Y')) AS R_MONTH_NAME,
COUNT(*) AS R_COUNT
FROM
dates d
GROUP BY
R_MONTH_NAME
По месяцам с ограничением длительности события на год/месяц/день (оставить одно условие для нужного эффекта):
SELECT
MONTHNAME(STR_TO_DATE(DATE_FORMAT(d.start_date, '01.%m.%Y'), '%d.%m.%Y')) AS R_MONTH_NAME,
COUNT(*) AS R_COUNT
FROM
dates d
WHERE
1 = 1
/* в один год */
/* AND STR_TO_DATE(DATE_FORMAT(d.start_date, '01.01.%Y'), '%d.%m.%Y') = STR_TO_DATE(DATE_FORMAT(d.end_date, '01.01.%Y'), '%d.%m.%Y') */
/* в один месяц */
/* AND STR_TO_DATE(DATE_FORMAT(d.start_date, '01.%m.%Y'), '%d.%m.%Y') = STR_TO_DATE(DATE_FORMAT(d.end_date, '01.%m.%Y'), '%d.%m.%Y') */
/* в один день */
/* AND STR_TO_DATE(DATE_FORMAT(d.start_date, '%d.%m.%Y'), '%d.%m.%Y') = STR_TO_DATE(DATE_FORMAT(d.end_date, '%d.%m.%Y'), '%d.%m.%Y') */
GROUP BY
R_MONTH_NAME
desktop.google.com
А если серьезно, то такие «велосипедисты» — очень большая проблема в реальных проектах. Они тратят огромное количество времени и средств заказчика на реализацию того, что уже было написано до них — просто потому, что либо не знают о существовании уже готового решения, либо буквально отвергают чужой код и идеи. Низкое качество продукта, перенос сроков и постоянное переписывание кода с нуля — вот самые болезненные признаки таких людей.
В iPhone нет полноценного GPS для навигации, нет полноценного bluetooth для передачи файлов, нет java, нельзя поставить свою мелодию на звонок.
В приведенных решениях мало того, что невозможно разобраться с первого раза (в одном из примеров даже потребовались комментарии!), этот код невозможно легко модифицировать, отлаживать, да и вообще что-либо с ним делать. За такой код, попади он в рабочую ветку, ваши коллеги долго будут вспоминать вас добрым словом.