Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择while,而不是选择while导致问题_Mysql - Fatal编程技术网

Mysql 选择while,而不是选择while导致问题

Mysql 选择while,而不是选择while导致问题,mysql,Mysql,我正在处理一个范围日期查询,并试图调整循环的规则,但我有一点问题: 采取以下行动: DROP PROCEDURE IF EXISTS test; CREATE PROCEDURE test ( IN start_date DATE ) BEGIN DECLARE group_name VARCHAR ( 10 ) DEFAULT 'clientA'; DECLARE service_name VARCHAR ( 10 ) DEFAULT 'serviceA'; WHILE

我正在处理一个范围日期查询,并试图调整循环的规则,但我有一点问题:

采取以下行动:

DROP PROCEDURE
IF EXISTS test;
CREATE PROCEDURE test ( IN start_date DATE ) BEGIN
    DECLARE group_name VARCHAR ( 10 ) DEFAULT 'clientA';
    DECLARE service_name VARCHAR ( 10 ) DEFAULT 'serviceA';
    WHILE ( start_date < CURDATE( ) && SUBDATE( start_date, INTERVAL - 2 WEEK ) < CURDATE( ) ) DO
        SELECT start_date AS 'Start Day',   SUBDATE( start_date, INTERVAL - 2 WEEK ) AS 'End Day';
        SET start_date = SUBDATE( start_date, INTERVAL - 2 WEEK );
    END WHILE;
END;
这将选择从起点到今天的开始和结束日期:

呼叫测试“2019-08-29”

返回5个结果:

08/29 & 09/12 09/12 & 09/26 09/26 & 10/10 10/10 & 10/24 10/24 & 11/7 这是我想要的,但不是5个结果。我希望这些都作为一个结果中的行。我认为最好的方法是通过一个子查询,内部查询运行循环并进行选择,而外部查询作为包装器将它们约束到一个集合中

我有以下代码:

    DROP PROCEDURE
    IF EXISTS test;
    CREATE PROCEDURE test ( IN start_date DATE ) BEGIN
        DECLARE group_name VARCHAR ( 10 ) DEFAULT 'clientA';
        DECLARE service_name VARCHAR ( 10 ) DEFAULT 'serviceA';
        SELECT * FROM (WHILE ( start_date < CURDATE( ) && SUBDATE( start_date, INTERVAL - 2 WEEK ) < CURDATE( ) ) DO
            SELECT start_date AS 'Start Day',   SUBDATE( start_date, INTERVAL - 2 WEEK ) AS 'End Day';
            SET start_date = SUBDATE( start_date, INTERVAL - 2 WEEK );
        END WHILE;
)
    END;
但这给了我:

1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near'作为'Result'的正确语法 在第4行的开始日期<当前日期和子日期开始日期


我觉得我的语法有点小问题,但我很难理解到底是什么。任何指导都会很好

您可以使用MySQL@variables创建日期活动的动态列表,并将其连接到任何表中,该表的行数与您在结果集中预期的行数相同。。。例如:如果您需要动态结果中的5条、10条或1000条记录

select
      -- whatever latest date is BECOMES the Begin Date
      @beginDT BeginDate,
      -- now, add 2 weeks to the @beginDT variable and save as the END Date
      @beginDT := date_add( @beginDT, interval 2 week ) EndDate
   from
      -- pick any table that has as many 2-week cycles as you expect.
      -- ex: if you wanted 1 yr, you would need any table with 26 or 27 records
      AnyTableWithManyRecords,
      -- start the query with your starting date, alias sqlvars is just place-holder
      -- and will only prepare the variable and be one row for rest of query
      ( select @beginDT := '2019-08-29' ) sqlvars
   having
      -- having will stop until your maximum date of interest
      BeginDate < curdate()
   -- but limit to 100 so you don't query against table of millions of records.
   -- how many records do you REALLY need to go through... again, 26 biweekly = 1 year
   -- this limit of 100 would allow for almost 4 yrs worth
   limit 100;
然后,如果您需要来自其他表的数据,您可以将上述结果集作为自己的结果集(如

select
      SOT.WhateverColumns
   from
      ( above query ) MyDates
         JOIN SomeOtherTable SOT
            on MyDates.BeginDate <= SOT.SomeDate
           AND SOT.SomeDate < MyDates.EndDate

出于好奇,您是否必须在每次运行新创建的过程时为这些表授予权限?不,没有权限被授予或更改