将日期作为 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 的购买日期介于StartDateEndDate 之间。我用我的 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

Mysql从入门到入魔——8. 视图存储过程事务处理

MySQL-进阶18 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'

在存储过程中使用日期时间作为参数更新表时出错

Mysql 存储过程实例详解