Лучший способ решить эту проблему - использовать DAYOFYEAR
.Трудной частью является случай, когда вы находитесь в течение 45 дней после окончания года, и в этом случае вы должны разделить чек, чтобы увидеть, находится ли дата между настоящим моментом и концом года или началом года.а сейчас + 45 дней;в противном случае вы просто проверяете, находится ли день года между сейчас и сейчас + 45 дней.Попробуйте заменить ваше условие следующим образом:
CASE WHEN DAYOFYEAR('2018-12-31')-DAYOFYEAR(NOW()) < 45 THEN
DAYOFYEAR(p.service_date) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR('2018-12-31') OR
DAYOFYEAR(p.service_date) BETWEEN 1 AND DAYOFYEAR(NOW() + INTERVAL 45 DAY)
ELSE
DAYOFYEAR(p.service_date) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR(NOW() + INTERVAL 45 DAY)
END
Ваш полный запрос должен выглядеть следующим образом:
SELECT
p.*,
c.company
FROM
products p
LEFT JOIN
customers c
ON c.id = p.id
WHERE
(CASE WHEN DAYOFYEAR('2018-12-31')-DAYOFYEAR(NOW()) < 45 THEN
DAYOFYEAR(p.service_date) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR('2018-12-31') OR
DAYOFYEAR(p.service_date) BETWEEN 1 AND DAYOFYEAR(NOW() + INTERVAL 45 DAY)
ELSE
DAYOFYEAR(p.service_date) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR(NOW() + INTERVAL 45 DAY)
END)
AND c.email_service = 1
ORDER BY
p.service_date ASC
Если вы беспокоитесь о високосных годах, вы можете изменить DAYOFYEAR('2018-12-31')
наDAYOFYEAR(CONCAT(YEAR(NOW), '-12-31'))