Нашел на просторах Интернета тестовую задачу, которую предлагала реализовать одна WEB-студия своим кандидатам на вакансию. Задачка показалась интересной, решил обдумать и реализовать.
Описание задачи:
"Вывести две колонки, в первой - названия месяцев текущего года, во второй - количество дней в месяце. Не использовать для решения какие либо таблицы, в том числе и временные. Код должен выдавать ответ сразу после запуска из консоли SQL редактора."
Размышления над реализацией позволили выявить следующее:
- Название месяца можно получить используя функцию MONTHNAME(), которая возвращает название месяца для заданной даты.
- Количество дней в месяце можно получить номером последнего дня месяца используя функцию DAY(), которая возвращает номер дня месяца из даты.
- Получить последний день месяца можно используя функцию LAST_DAY(), которая вернет последний день месяца для указанной даты.
- Всего у нас 12 месяцев, количество дней разное, но каждый месяц имеет дату 01 - первое число месяца. Поэтому за текущую дату для расчета в каждом месяце можно брать первое число.
- Получить дату месяца текущего года можно используя функцию CONCAT, которая склеивает подстроки, в частности год, номер месяца и число месяца.
- Чтобы получить результат требуется обработать в каждом месяце дату первого числа, и так 12 раз - это можно осуществить используя рекурсию. Для реализации использую рекурсивное общее табличное выражение WITH RECURSIVE.
Вот такая итоговая реализация получилась: