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