mysql> Create Procedure sp_Getnewtask(IN sdate datetime, IN edate datetime,IN sid int,IN tid int,OUT outmsg varchar(50))
-> begin
-> if not exists(
-> SELECT * FROM tbltask WHERE (startdate BETWEEN sdate AND edate)OR (enddate BETWEEN sdate AND edate) OR (sdate BETWEEN startdate AND enddate) OR (edate BETWEEN startdate AND enddate) OR Sid=Sid OR Tid=tid ) then
-> set outmsg = 'ADDED SUCESSFULLY';
-> else
-> set outmsg = 'RECORD ALREADY PRESENT';
-> end if;
-> end $$
mysql> select * from tbltask;
| tblid | startdate | enddate | Sid | Lid |
| 1 | 2011-05-20 00:00:00 | 2011-05-29 00:00:00 | NULL | NULL |
1 row in set (0.00 sec)
即使数据库中没有记录,它也会显示为记录已存在,
如果我从选择查询中删除 sid,tid ,它就可以正常工作, 请提出一些想法,以便正确检查运行输出
当我尝试调用该过程时, 它返回为,
mysql> call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg);
-> select @outmsg;
-> $$
查询正常,0 行受影响(0.00 秒)
| @outmsg |
| RECORD ALREADY PRESENT |
一组 1 行(0.00 秒)
但我的实际结果应该是“添加成功”
最佳答案
仅当您的 select 语句中未选择任何记录时,才应报告“ADDED SUCCESSFULLY”,但考虑到您在 call sp_Getnewtask('2011-05-20','2011-05-29',6 中输入的变量,8,@outmsg);
实际上,您在所有 WHERE 的 OR 条件中触发了 6 个条件中的 4 个。
编辑添加:
我已经运行了以下命令(包括结果)。我所做的是更改变量的名称,这样您就不会得到始终为 true 的 WHERE 语句(SID=SID 或 TID=TID
将始终为 true)。我还更改了 SELECT
语句以匹配您作为示例给出的表中的字段名称。
CREATE TABLE tbltask
(
tblid int,
startdate datetime,
enddate datetime,
sid int,
lid int
);
INSERT INTO `tbltask`(`tblid`, `startdate`, `enddate`) VALUES (1, '2011-05-20 00:00:00','2011-05-29 00:00:00');
DELIMITER //
CREATE Procedure sp_Getnewtask(IN sdate datetime, IN edate datetime,IN inSid int,IN inLid int,OUT outmsg varchar(50))
begin
if not exists
(
SELECT * FROM tbltask WHERE (startdate BETWEEN sdate AND edate)OR (enddate BETWEEN sdate AND edate) OR (sdate BETWEEN startdate AND enddate) OR (edate BETWEEN startdate AND enddate) OR Sid=inSid OR Lid=inLid
) then
set outmsg = 'ADDED SUCCESSFULLY';
else
set outmsg = 'RECORD ALREADY PRESENT';
end if;
end
//
call sp_Getnewtask('2011-05-20','2011-05-29',6,8,@outmsg);
select @outmsg;
RECORD ALREADY PRESENT
call sp_Getnewtask('2010-05-20','2010-05-29',6,8,@outmsg);
select @outmsg;
ADDED SUCCESSFULLY
就目前情况而言,这似乎正在做它应该做的事情。如果任一日期范围相交,它将找到该记录。如果它们不相交,但 sid 或 lit 匹配,则它将找到该记录。找到记录后会报告“记录已存在”
关于mysql - 选择查询中的逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25974917/