mysql时间操作函数和存储过程

本文详细介绍了使用MySQL存储过程和时间操作函数优化数据统计流程的方法,包括处理循环、文件字符错误、分块执行以及SQL语句优化。通过实例展示了如何根据时间间隔(每五分钟)统计特定时间段内不同地点的车辆流量,并提供了优化建议以提高处理大量数据的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

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

下面贴代码了:

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


delimiter $
drop procedure transport_status;
create procedure transport_status(start_time datetime,end_time datetime)
begin
        declare mid_start_time datetime;
        declare mid_end_time datetime;
        set mid_start_time=start_time;
        set mid_end_time=date_add(start_time, interval 5 minute);
        lab: while mid_start_time < end_time do
                insert into
                        test.transport_status(stamp,stamp_time,address,car_count)
                        (select
                                FLOOR(UNIX_TIMESTAMP(time)/300) as stmp,
                                date_format(mid_end_time,'%Y-%m-%d %H:%i:%s') as tm,
                                address,
                                count(address) as cnt
                        from
                        test.transport20140901
                        where
                        time > date_add(mid_start_time, interval -1 second)
                        and time < mid_end_time
                        group by address);
                set mid_start_time=date_add(mid_start_time, interval 5 minute);
                set mid_end_time=date_add(mid_end_time, interval 5 minute);
        end while lab;
end $
delimiter ;

call transport_status("2014-09-01 00:00:00","2014-09-2 00:00:00");



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值