I'm not familiar enough with MySql to know if this will port, however here is a tested and confirmed SQL Server solution.
The fiddle link is here for your use.
Given start dates 02/20/2018 and 02/20/2020, the result set is as follows:
Year |
periodStart |
periodEnd |
DaysInPeriod |
2018 |
2018-02-20 |
2018-12-31 |
314 |
2019 |
2019-01-01 |
2019-12-31 |
365 |
2020 |
2020-01-01 |
2020-02-20 |
51 |
Declare @StartDate date = '2018-02-20', @EndDate date = '2020-02-20';
WITH x AS (SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)),
Years AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Year
FROM x ones, x tens, x hundreds, x thousands)
SELECT Years.Year,
CASE
WHEN Year(@StartDate) = Years.year THEN @StartDate
ELSE DATEFROMPARTS(years.year, 01, 01)
END AS periodStart,
CASE
WHEN Year(@EndDate) = Years.year THEN @EndDate
ELSE DATEFROMPARTS(years.year, 12, 31)
END AS periodEnd,
DATEDIFF(day,
CASE
WHEN Year(@StartDate) = Years.year THEN @StartDate
ELSE DATEFROMPARTS(years.year, 01, 01)
END,
CASE
WHEN Year(@EndDate) = Years.year THEN @EndDate
ELSE DATEFROMPARTS(years.year, 12, 31)
END
) + 1 AS DaysInPeriod
FROM Years
WHERE Years.Year >= Year(@StartDate)
AND Years.Year <= Year(@EndDate)