Я думаю, что это сработает:
SELECT SUM(price) AS price_sum, month_half FROM
(
SELECT price,
IF(
DATEDIFF(`date`, DATE_FORMAT(`date`, "%Y-%m-01")) > 15,
CONCAT(
DATE_FORMAT(`date`, "%b %Y Day 16 - "),
DATE_FORMAT(
DATE_SUB(
DATE_ADD(DATE_FORMAT(`date`, "%Y-%m-01"), INTERVAL 1 MONTH),
INTERVAL 1 DAY), "%d"
)
),
DATE_FORMAT(`date`, "%b %Y Day 1 - 15")
) AS month_half,
`date` AS order_date
FROM table WHERE
`date` >= DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
) AS t
GROUP BY month_half ORDER BY order_date
Здесь происходит то, что я использую DATEDIFF , чтобы найти количество дней с начала месяца и, таким образом, найти вкакой половине месяца соответствует значение date .Также я использовал DATE_SUB вместе с DATE_ADD , чтобы найти последний день месяца (из соображений отображения).
Я добавил параметр формата % Y на тот случай, если он охватывает диапазон дат, превышающий 1 год, и в этом случае вы будете иметь повторные названия месяцев.
Надеюсьэто помогает.Приветствия.