Как получить записанные даты и не записанные дни в базе данных в sql

#mysql

Вопрос:

Я написал запрос, чтобы получить два дня между всеми днями в базе данных, но мое требование состоит в том, чтобы получить записанные даты, а не записанные дни в базе данных. теперь этот вывод запроса-это только записанные даты в базе данных. Мне нужно получить все дни между двумя датами

мой вопрос таков

 SELECT COUNT(activity_detail.activity_type_config_id) As count,
user_det.full_name, DATEPART(day, activity_detail.created_date) AS day,
DATEPART(month, activity_detail.created_date) AS month,
DATEPART(year, activity_detail.created_date) AS year
FROM activity_detail activity_detail,activity_type_config activity_type_config,activity_user user_det 
WHERE activity_detail.activity_type_config_id = activity_type_config.activity_type_config_id and user_det.activity_user_id = activity_detail.activity_user_id
AND activity_detail.created_date BETWEEN '2021-01-08 10:18:13' AND '2021-11-17 10:40:09' 
GROUP BY user_det.full_name,DATEPART(month, activity_detail.created_date),DATEPART(day, activity_detail.created_date),DATEPART(year, activity_detail.created_date)
ORDER BY DATEPART(year, activity_detail.created_date) ASC, DATEPART(month, activity_detail.created_date) ASC,DATEPART(day, activity_detail.created_date)
 

Выход

 count name day month year
1   john1   8   8    2021
1   carter  11  8   2021
1   john1   15  9   2021
4   john1   18  9   2021
7   carter  18  9   2021
1   john1   19  9   2021
2   carter  19  9   2021
3   john1   20  9   2021
42  carter21    9   2021
1   john1   21  9   2021
 

мне нужен результат

 count name day month year
0   null    1   8    2021
0   null    2   8   2021...
1   john1   8   8    2021
1   carter  11  8   2021
0   null    1   9   2021
0   null    2   9   2021
0   null    3   9   2021...
1   john1   15  9   2021
4   john1   18  9   2021
7   carter  18  9   2021
1   john1   19  9   2021
2   carter  19  9   2021
3   john1   20  9   2021
0   null  16    11  2021
0   null    17  11  2021
 

результат не записанных дней должен быть равен 0,null, но их нет в базе данных.
помогите получить все даты.

Ответ №1:

Это будет что-то вроде (не отлажено)

 WITH RECURSIVE
nums AS ( SELECT 1 num
          UNION ALL
          SELECT num   1 FROM nums WHERE num < 31 ),
ranges AS ( SELECT MIN(day) day, month, year
            FROM table
            GROUP BY 2,3 )
data AS ( {your query text} ) 
SELECT count, name, day, month, year
FROM data
UNION ALL
SELECT 0, NULL, nums.num, ranges.month, ranges.year
FROM nums
JOIN ranges ON nums.num < ranges.day