mysql存储过程1267_mysql存储过程一例

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值