#mysql #sql #while-loop
#mysql #sql #цикл while
Вопрос:
У меня есть запрос, который нужно запускать на каждый день месяца, есть ли способ, которым я могу выполнить один запрос, чтобы мне не приходилось изменять дату в запросе при каждом его запуске. Я пытался использовать цикл While, но он не дает мне никаких ответов. Когда я запускаю приведенный ниже код, он показывает ошибку 1064
set @StartDate1 = '2020-07-01';
set @EndDate = '2020-07-30';
WHILE (@StartDate1 < @EndDate) DO
SELECT COUNT(id ), json_extract(data , '$.metadata.referred')
FROM modulusDb mdb
where json_extract(data , '$.event') = 'install' and json_extract(data , '$.metadata.referred') = TRUE
and created_at >= @StartDate1 and created_at < DATEADD(day, 1, @StartDate1)
SET @StartDate1 = DATEADD(day, 1, @StartDate1)
END WHILE
Комментарии:
1. в sql нет цикла while, вы должны запустить его в сохраненном pocedire или функции
Ответ №1:
Вы должны выполнить это в процедуре или функции, и каждая команда должна иметь точку с запятой; в конце
Дополнительный DATEADD не существует в mysql или у вас есть функция с таким именем
CREATE TABLE modulusDb(id INT, data JSON,created_at DATE);
DROP procedure IF EXISTS `dowhile`;
DELIMITER $$
CREATE PROCEDURE `dowhile`()
BEGIN
set @StartDate1 = '2020-07-01';
set @EndDate = '2020-07-30';
WHILE (@StartDate1 < @EndDate) DO
SELECT COUNT(id ), json_extract(data , '$.metadata.referred')
FROM modulusDb mdb
where json_extract(data , '$.event') = 'install' and json_extract(data , '$.metadata.referred') = TRUE
and created_at >= @StartDate1 and created_at < DATE_ADD(@StartDate1, INTERVAL 1 DAY);
SET @StartDate1 = DATE_ADD(@StartDate1, INTERVAL 1 DAY);
END WHILE;
END$$
DELIMITER ;
Mysql не нравится ваш оператор select. в нем нет синтаксических ошибок, но это incompatible with sql_mode=only_full_group_by
Комментарии:
1. Спасибо за ответ, но он по-прежнему показывает эту ошибку «Ошибка SQL [1064] [42000]: у вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘WHILE (@StartDate1 < @EndDate) DO’ в строке 1»
2. @ShubhamJain У процедуры нет проблем с синтаксисом. db-fiddle.com/f/695vAPEUz1zKikmYsTXTse/0
3. я тестирую ваш код, как вы можете видеть, но я не могу его запустить