我的日常

登录/注册
您现在的位置:论坛 资料库 数据库开发 > mysql如何操作函数和存储过程
总共48087条微博

动态微博

查看: 1613|回复: 0

mysql如何操作函数和存储过程

[复制链接]

279

主题

41

听众

689

金钱

版主

该用户从未签到

跳转到指定楼层
楼主
发表于 2015-06-07 21:37:20 |只看该作者 |倒序浏览




由于业务需要统计一批数据,用到关于mysql的时间操作函数和存储过程,问题已经基本解决,把过程记录下:


1. mysql的语句中不支持直接用循环,循环只能在存储过程中使用;


2. 写为文件时,注意一些隐藏的字符,造成语法错误。本例中注释中包含一些不可见字符,没有找到。


3. 存储过程中尽量多使用分好,分割开语句。本例中 drop一句最初没有写,导致一直有错。


4. 时间函数很强大,可以避免一些工作。http://www.cnblogs.com/ggjucheng/p/3352280.html


5. sql语句的优化很重要,本例中仅解决了问题,但数据量太大,存储过程运行了很久。期待有人能帮忙优化while语句中的优化。


下面贴代码了:





  1. --*将表test.transport20140901表中的数据按照每五分钟一个间隔,统计各个路口的车流数量r
  2. --*@start_time 起始时间 是整点时间的五分钟间隔 如 2014-09-01 00:20:00
  3. --*@end_time  终止时间  是整点的五分钟间隔且大于start_time  如 2014-09-01 01:00:00
  4. --*统计范围包含起始时间,但不包含终止时间


  5. delimiter $
  6. drop procedure transport_status;
  7. create procedure transport_status(start_time datetime,end_time datetime)
  8. begin
  9.         declare mid_start_time datetime;
  10.         declare mid_end_time datetime;
  11.         set mid_start_time=start_time;
  12.         set mid_end_time=date_add(start_time, interval 5 minute);
  13.         lab: while mid_start_time < end_time do
  14.                 insert into
  15.                         test.transport_status(stamp,stamp_time,address,car_count)
  16.                         (select
  17.                                 FLOOR(UNIX_TIMESTAMP(time)/300) as stmp,
  18.                                 date_format(mid_end_time,'%Y-%m-%d %H:%i:%s') as tm,
  19.                                 address,
  20.                                 count(address) as cnt
  21.                         from
  22.                         test.transport20140901
  23.                         where
  24.                         time > date_add(mid_start_time, interval -1 second)
  25.                         and time < mid_end_time
  26.                         group by address);
  27.                 set mid_start_time=date_add(mid_start_time, interval 5 minute);
  28.                 set mid_end_time=date_add(mid_end_time, interval 5 minute);
  29.         end while lab;
  30. end $
  31. delimiter ;

  32. call transport_status("2014-09-01 00:00:00","2014-09-2 00:00:00");
复制代码




科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表