Я пытался автоматизировать SQL-запрос для выполнения на каждый день месяца, в то время как цикл не работает. Запрос выдает ошибку 1064

#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. я тестирую ваш код, как вы можете видеть, но я не могу его запустить