我试图自动化一个SQL查询以在每月的每一天运行,而循环不起作用查询给出错误1064

问题描述

我有一个查询需要在每月的每一天运行,有没有一种方法可以运行一个查询,这样我就不必在每次运行时都更改查询中的日期。我尝试使用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,@StartDate1)
END WHILE

解决方法

您必须在过程或函数中执行此操作 每个命令必须有分号;最后

另外的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.statement,它没有语法错误,但这是incompatible with sql_mode=only_full_group_by