设置存储过程参数时出现mysql语法错误

设置存储过程参数时出现mysql语法错误,mysql,mysql-workbench,mysql-error-1064,Mysql,Mysql Workbench,Mysql Error 1064,我为mysql存储过程编写了代码,它显示了语法错误,我不知道我犯了什么错误。谁来帮帮我 DELIMITER $$ DROP PROCEDURE IF EXISTS `aad_adr`.` PROCEDURE MonthlySalesReport(fromdate DATE,todate DATE)` $$ CREATE PROCEDURE `aad_adr`.` PROCEDURE MonthlySalesReport(fromdate DATE,todate DATE)` () BEGIN

我为mysql存储过程编写了代码,它显示了语法错误,我不知道我犯了什么错误。谁来帮帮我

DELIMITER $$

DROP PROCEDURE IF EXISTS `aad_adr`.` PROCEDURE MonthlySalesReport(fromdate DATE,todate DATE)` $$
CREATE PROCEDURE `aad_adr`.` PROCEDURE MonthlySalesReport(fromdate DATE,todate DATE)` ()
BEGIN
Declare fd DATE;
Declare ed DATE;
SET fd=fromdate;
SET ed=todate;
WHILE DATE(fd)<=DATE(ed)DO
select bill_master.bill_no,DATE_FORMAT(bill_master.bill_date, '%y/%m/%d') AS 'formatted_date',transaction.product_id,transaction.tax_amount,transaction.amount,transaction.amount-transaction.tax_amount as 'without_tax ',product_master.Product_name,product_master.vat from bill_master inner join transaction on bill_master.bill_no=transaction.bill_no inner join product_master on transaction.product_id=product_master.product_id where vat='14.50' and DATE_FORMAT(bill_master.bill_date, '%y/%m/%d') fd;
SET fd=DATE_ADD(fd,INTERVAL 1 DAY);
END WHILE;
END $$

DELIMITER;
首先,您有两个错误: 第一个是过程的名称

CREATE PROCEDURE `aad_adr`.` PROCEDURE MonthlySalesReport(fromdate DATE,todate DATE)` ()
--->

所以你的程序应该是这样的:

DELIMITER $$
DROP PROCEDURE IF EXISTS `aad_adr`.`MonthlySalesReport`$$
CREATE PROCEDURE `aad_adr`.`MonthlySalesReport`(fromdate DATE,todate DATE)
BEGIN
Declare fd DATE;
Declare ed DATE;
SET fd=fromdate;
SET ed=todate;
WHILE DATE(fd)<=DATE(ed)DO
select 
bill_master.bill_no,
DATE_FORMAT(bill_master.bill_date,'%y/%m/%d') AS 'formatted_date',
transaction.product_id,
transaction.tax_amount,
transaction.amount,
transaction.amount-transaction.tax_amount as 'without_tax ',
product_master.Product_name,
product_master.vat 
from 
bill_master inner join transaction on bill_master.bill_no=transaction.bill_no 
inner join product_master on transaction.product_id=product_master.product_id 
where
vat='14.50' and vat='14.50' and DATE_FORMAT(bill_master.bill_date, '%y/%m/%d');
SET fd=DATE_ADD(fd,INTERVAL 1 DAY);
END WHILE;
END $$
DELIMITER ;
分隔符$$
删除程序(如果存在)`aad_adr`.`MonthlySalesReport`$$
创建程序“aad_adr”。“月报表”(fromdate日期,todate日期)
开始
宣布fd日期;
宣布终止日期;
设置fd=fromdate;
设置ed=todate;

当select查询中的DATE(fd)错误时,您调用的where条件错误。所以只需删除where子句中的DATE_格式,只需再修改一次即可替换
分隔符到最后一个中的分隔符$$

更新1:修改了SP的有效名称

因此,更新的代码是:

DELIMITER $$

DROP PROCEDURE IF EXISTS `aad_adr`.`MonthlySalesReport` $$
CREATE PROCEDURE `aad_adr`.`MonthlySalesReport`(IN fromdate DATE,IN todate DATE)
     BEGIN
       DECLARE fd DATE;
       DECLARE ed DATE;
       SET fd=fromdate;
       SET ed=todate;
       WHILE DATE(fd)<=DATE(ed)DO
             SELECT bill_master.bill_no,DATE_FORMAT(bill_master.bill_date, '%y/%m/%d') AS 'formatted_date',transaction.product_id,transaction.tax_amount,transaction.amount,transaction.amount-transaction.tax_amount AS 'without_tax ',product_master.Product_name,product_master.vat FROM bill_master INNER JOIN TRANSACTION ON bill_master.bill_no=transaction.bill_no INNER JOIN product_master ON transaction.product_id=product_master.product_id WHERE vat='14.50' AND bill_master.bill_date=fd;
          SET fd=DATE_ADD(fd,INTERVAL 1 DAY);
       END WHILE;
    END $$
DELIMITER$$
分隔符$$
删除程序(如果存在)`aad_adr`.`MonthlySalesReport`$$
创建程序“aad_adr”。“月报表”(在fromdate日期中,在todate日期中)
开始
宣布fd日期;
宣布终止日期;
设置fd=fromdate;
设置ed=todate;

虽然日期(fd)删除where子句中日期之后的fd格式…谢谢你现在它已经执行如果你在这篇文章中找到了解决方案,那么你应该遵循这个,对不起,我没有注意到下降摄像头,所以你也需要更新名称我编辑了我的答案,请尝试一下,告诉我它是否有效这应该有效,但你所说的日期格式是什么意思(bill_master.bill_date,'%y/%m/%d')日期在sql中是这样的,还是bill_date是varchar?
DELIMITER $$
DROP PROCEDURE IF EXISTS `aad_adr`.`MonthlySalesReport`$$
CREATE PROCEDURE `aad_adr`.`MonthlySalesReport`(fromdate DATE,todate DATE)
BEGIN
Declare fd DATE;
Declare ed DATE;
SET fd=fromdate;
SET ed=todate;
WHILE DATE(fd)<=DATE(ed)DO
select 
bill_master.bill_no,
DATE_FORMAT(bill_master.bill_date,'%y/%m/%d') AS 'formatted_date',
transaction.product_id,
transaction.tax_amount,
transaction.amount,
transaction.amount-transaction.tax_amount as 'without_tax ',
product_master.Product_name,
product_master.vat 
from 
bill_master inner join transaction on bill_master.bill_no=transaction.bill_no 
inner join product_master on transaction.product_id=product_master.product_id 
where
vat='14.50' and vat='14.50' and DATE_FORMAT(bill_master.bill_date, '%y/%m/%d');
SET fd=DATE_ADD(fd,INTERVAL 1 DAY);
END WHILE;
END $$
DELIMITER ;
DELIMITER $$

DROP PROCEDURE IF EXISTS `aad_adr`.`MonthlySalesReport` $$
CREATE PROCEDURE `aad_adr`.`MonthlySalesReport`(IN fromdate DATE,IN todate DATE)
     BEGIN
       DECLARE fd DATE;
       DECLARE ed DATE;
       SET fd=fromdate;
       SET ed=todate;
       WHILE DATE(fd)<=DATE(ed)DO
             SELECT bill_master.bill_no,DATE_FORMAT(bill_master.bill_date, '%y/%m/%d') AS 'formatted_date',transaction.product_id,transaction.tax_amount,transaction.amount,transaction.amount-transaction.tax_amount AS 'without_tax ',product_master.Product_name,product_master.vat FROM bill_master INNER JOIN TRANSACTION ON bill_master.bill_no=transaction.bill_no INNER JOIN product_master ON transaction.product_id=product_master.product_id WHERE vat='14.50' AND bill_master.bill_date=fd;
          SET fd=DATE_ADD(fd,INTERVAL 1 DAY);
       END WHILE;
    END $$
DELIMITER$$