问题描述
我有一个MysqL存储过程,如果没有给出其值,我需要排除一个参数。 如果我用两个参数调用存储过程,它应该可以运行,但程序条件除外。
我的当前查询
DELIMITER //
CREATE PROCEDURE Getutilization2(
IN programName VARCHAR(30),IN date1 VARCHAR(20),IN date2 VARCHAR(20)
)
BEGIN
SELECT
SUM(task_hours) as total,(SUM(CASE when task_category = 'Production' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100 AS production,(SUM(CASE when task_category = 'Non Production' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100 AS non_production,(SUM(CASE when task_category = 'Training' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100 AS Training,(SUM(CASE when task_category = 'Absenteeism' THEN task_hours ELSE 0 END)/SUM(task_hours)) * 100 AS Absenteeism,(SUM(CASE when utilization_type = 'Extended' THEN task_hours ELSE 0 END) /((SUM(task_hours)-SUM(CASE when utilization_type = 'Extended' THEN task_hours ELSE 0 END)))) * 100 AS OT
FROM data_table
WHERE program = programName and date(task_date) between date1 and date2;
END //
DELIMITER ;
预期输出
**If Program not given exclude program from query**
DELIMITER //
CREATE PROCEDURE Getutilization2(
IN programName VARCHAR(30),(SUM(CASE when utilization_type = 'Extended' THEN task_hours ELSE 0 END) /((SUM(task_hours)-SUM(CASE when utilization_type = 'Extended' THEN task_hours ELSE 0 END)))) * 100 AS OT
FROM data_table
WHERE date(task_date) between date1 and date2;
END //
DELIMITER ;
可选:您能以更有效的方式进行查询吗?
解决方法
2 puppeteer windows
请勿将WHERE (programName is null or program = programName)
AND date(task_date) between date1 and date2;
用作日期的数据类型。使用varchar
或date
。如果您不使用阻止使用索引的函数,则查询的运行速度可能会更快:
代替
datetime
使用
date(task_date) between date1 and date2