将日期作为 MySQL 存储过程的 IN 参数处理
Posted
技术标签:
【中文标题】将日期作为 MySQL 存储过程的 IN 参数处理【英文标题】:Handling Dates as IN Parameters of a MySQL Stored Procedure 【发布时间】:2019-01-19 02:49:35 【问题描述】:我想要实现的目标
我正在我的 mysql 数据库上创建一个Procedure
,它将获得标记为netamt
的净金额列的总计,其中标记为purdate
的购买日期介于StartDate
和EndDate
之间。我用我的 SQL 查询尝试了两种不同的方法。当我运行CREATE
查询时,MySQL 会接受它并创建我的Procedure
。但是,当我尝试调用 Procedure
时,它会返回 NULL
。
我的 SQL 查询
这是我的第一个 CREATE
代码的样子:
CREATE DEFINER=`*****`@`localhost` PROCEDURE `Payable_Total_Net`(
IN startDate DATE,
IN endDate DATE,
OUT totalNet DECIMAL(19,4)
)
BEGIN
SELECT
SUM(COALESCE(p.netamt,0)) INTO totalNet
FROM Payables p
WHERE p.purdate >= str_to_date(startDate, '%Y-%m-d%') AND p.purdate <= str_to_date(endDate, '%Y-%m-d%');
END
这是我的第二个CREATE
代码的样子:
CREATE DEFINER=`*****`@`localhost` PROCEDURE `Payable_Total_Net`(
IN startDate DATE,
IN endDate DATE,
OUT totalNet DECIMAL(19,4)
)
BEGIN
SELECT
SUM(COALESCE(p.netamt,0)) INTO totalNet
FROM Payables p
WHERE p.purdate BETWEEN str_to_date(startDate, '%Y-%m-d%') AND str_to_date(endDate, '%Y-%m-d%');
END
这是正常查询的样子,结果正确:
SELECT
SUM(COALESCE(p.netamt,0)) as totalNet
FROM Payables p
WHERE p.purdate BETWEEN '2018-01-01' AND '2018-12-31'
这就是我如何称呼Procedure
:
Call Payable_Total_Net('2018-01-01','2018-12-31',@totalNet);
SELECT @totalNet;
我当前的存储过程
我要调用存储过程的查询
同时运行两个查询的结果
只运行 Select 查询的结果
这是我使用普通查询的预期结果
【问题讨论】:
purdate 是如何存储在应付款表中的? 【参考方案1】:您将值作为日期传递。你不需要转换它们:
CREATE DEFINER=`*****`@`localhost` PROCEDURE `Payable_Total_Net`(
IN in_startDate DATE,
IN in_endDate DATE,
OUT out_totalNet DECIMAL(19,4)
)
BEGIN
SELECT COALESCE(SUM(p.netamt), 0) INTO out_totalNet
FROM Payables p
WHERE p.purdate >= in_startDate AND
p.purdate <= in_endDate;
END;
【讨论】:
我试过了,它仍然返回NULL
。附:我可以在这里发布屏幕截图吗?
我已按照建议使用最近更改的屏幕截图更新了问题。以上是关于将日期作为 MySQL 存储过程的 IN 参数处理的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 存储过程传参之in, out, inout 参数用法
MySQL-进阶18 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'