同事给的一个存储过程有点问题,测试发现" 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)