同事给的一个存储过程有点问题,测试发现" IF date_format(sysdate(),'%H:%i:%s') > From_Time AND date_format(sysdate(),'%H:%i:%s') < End_Time THEN"
这个语句有问题。创建如下存储过程进行分析:
mysql> delimiter //
mysql> create procedure proc_t(in from_time time,in end_time time)
-> begin
-> IF date_format(sysdate(),'%H:%i:%s') > From_Time AND date_format(sysdat
e(),'%H:%i:%s') < End_Time THEN
-> select 'a';
-> else
-> select 'b';
-> end if;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
该存储过程只是判断是否满足条件,执行结果是报错:
mysql> call proc_t('23:00:00','23:50:00');
ERROR 1267 (HY000): Illegal mix of collations (gbk_chinese_ci,COERCIBLE) and (la
tin1_swedish_ci,NUMERIC) for operation '>'
如果按照1267错误去找,可能就偏离答案了。实际执行的存储过程中有对该报错的处理,因此结果不符合预期,但也没有报错。
由于输入变量from_time和end_time都是时间类型,而比较时使用date_format(sysdate(),'%H:%i:%s')生成的是字符串,不具有可比性,造成报错。
通过time函数,将比较运算符两边修改为都是时间格式,就不会报错了:
mysql> create procedure proc_t(in from_time time,in end_time time)
-> begin
-> IF time(sysdate()) > From_Time AND time(sysdate()) < End_Time THEN
-> select 'a';
-> else
-> select 'b';
-> end if;
-> end //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call proc_t('23:00:00','23:59:00');
+---+
| a |
+---+
| a |
+---+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-1876503/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26451536/viewspace-1876503/