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)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-1876503/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26451536/viewspace-1876503/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值