#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